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

来源:百度知道 编辑:UC知道 时间:2024/06/02 05:33:30
请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步都可以再优化一下,使计算量减少。

斑竹 我这是一个自己以前用链表编的,你把m改称k就可以了

type
point=^node;
node=record
date:integ

n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入 C程序有关N个人报数问题? 2:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子, 从第一个人依次从1到N循环报数,当报数为N时,此人出圈,直到一个人为止,按退出的次序输出出圈人编号。 由n个人里选k个人的组合数 = 由(n-1)个人里选k个人的组合数+由(n-1)个人里选(k-1)个人的组合数 1000个人报数 6个人做游戏,从第一个人开始报数,从1开始报,第六个人报完以后又回到第一个人开始报数,请问谁报到3000 20. n个人围成一圈,1,2,3循环报数,报到3的人退出 第一个人 轮流报数,每次报出的数不能超过5,也不能是0,把两个人报出的数连加起来,谁报数后使和变成25,谁就获胜.