n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入
来源:百度知道 编辑:UC知道 时间:2024/06/02 05:33:30
急!!!!!!!!!!
答案要过程
赏金日后会补上(奖金有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