n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入请pascal高手帮忙那!赏金日后会补上(奖金有20分)请个位高手援手相告
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/27 18:12:44
n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入请pascal高手帮忙那!赏金日后会补上(奖金有20分)请个位高手援手相告
n个人围成个圈由第一个人报数数到k出圈再由下一个报数数到k出圈依次输出出圈的编号n的值先设计k的值输入
请pascal高手帮忙那!
赏金日后会补上(奖金有20分)
请个位高手援手相告
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步都可以再优化一下,使计算量减少.