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