作业帮 > 综合 > 作业

n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/09 17:30:16
n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入
请pascal高手帮忙那!
赏金日后会补上(奖金有20分)
请个位高手援手相告
var n,k,i,j,tou,num:integer;
  a:array[1..20]of integer;
  begin
  for i:=1 to 20 do
  a[i]:=0;
  read(n,k);
  for i:=1 to n do
  inc(a[i]);
  tou:=1;
  j:=0;
  repeat
  if tou>n then tou:=1
  else
  begin
  if a[tou]>0 then
  begin
  inc(num);
  if num=k then
  begin
  write(tou,' ');
  a[tou]:=0;
  inc(j);
  num:=0;
  end;
  inc(tou);
  end
  else inc(tou);
  end;
  until j=n;
  end.
  分析:
  1)我用一个数组a来保存原位置(0则表示人不在,1则表示人在).
  2)tou是用来控制当前位置的,如果人在则报数(num为她报的数,若num为k,则将他踢走,且下一人再从1开始报,即a[tou]:=0,num:=0,不为k,则下一个),若人不在,就直接看下一位置,直到有人为止.
  3)因为人数是n个,则当tou>n时,就要使tou变回原来的1,否则将无限累加,直到报错(这是很重要的问题,进入死循环程序就不会有解)
  4)其中repeat是用来记录已踢出的人数,只要条件1满足,程序就可以停止了.
  因为我很久没搞,所以程序不算最优,在第2、3、4步都可以再优化一下,使计算量减少.
n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入 M个人围成一圈,从第一个人开始报数,数到n的人出圈.再由下一个人开始报数,数到n的人出圈,……输出依次 求做一个C语言题目约瑟夫问题.M个人围成一个圈,从第一个人开始报数,数到N的人出圈,再由下一个人开始报数,数到N的人出圈 设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人 C 设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一 约瑟夫问题:M个人围成一圈,从第一个人开始依次从1到N循环报数,每当报数为N时此人出圈,直到剩一人为止 约瑟夫环 已知n个人围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列,m是什么 vb求约瑟夫问题的求解:有n个人围成一个圈,由第一个人开始报数,数到第k个人,这个人 C语言:有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子 C语言 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子 有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数, 用C语言编写:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,请输出报数出列圈及最