永发信息网

【pascal】求约瑟夫问题的递归求法(程序)

答案:4  悬赏:0  手机版
解决时间 2021-04-29 04:18
  • 提问者网友:沦陷
  • 2021-04-28 14:52
rt
最佳答案
  • 五星知识达人网友:低音帝王
  • 2021-04-28 15:15
约瑟夫问题。M个人围成一圈,从第一个人开始报数,数到n的人出圈。再由下一个人开始报数,数到n的人出圈,……输出依次出圈人的编号。M值预先选定,n值由键盘输入。

[解题分析]
用一个数组存储M个人,先初始化数组,并使数组元素的值等于1,输入n的值。从1到M循环,判断该元素是否为数到n的元素,若是,则输出,并把其值赋为0,表示该元素已从数组中删除。
[算法设计]
(1) 初始化数组a[I],赋值为1。
(2) 读入n的值。
(3) for i:=1 to m do
3.1 计数器s赋值为0;
3.2 while s<n do
如果j<m,则j:=j+1;否则j:=1。并且s:=s+a[j]。
(4) 输出j的值,也就是出圈人的编号。并把a[j]赋值为0;
[程序]
PROGRAM ex6(input,output);
CONST
m=16;
VAR
a:array[1..m] of integer;
n,s,i,j:integer;
Begin
{初始准备}
for i:=1 to m do
a[i]:=1;
read(n);
writeln('n=',n);
j:=0;
{输出m个出圈人编号}
for i:=1 to m do
begin
{计数清0}
s:=0;
{计数为n时结束}
while s<n do
begin
{处理下标}
if j<m then j:=j+1
else j:=1 ;
{计数}
s:=s+a[j]
end;
{输出出圈人编号}
write(j:3);
{该元素清0}
a[j]:=0
end
end.
____________________________________________
program ___;
const m=8;
var

begin
readln(n);
fillchar(a,sizeof(a),true);
i:=1;
s:=1;
b:=m;
repeat
if i>m
then i:=i mod m;
if a[i]
then begin
if s mod n=0
then begin
a[i]:=false;
writeln(i:2);
b:=b-1
end;
s:=s+1;
end;
i:=i+1;
until b=0;
readln;
end.

全部回答
  • 1楼网友:行雁书
  • 2021-04-28 18:19
var n,m,s,f,t:integer; a:array[1..100] of 0..1; begin writeln('input m,n); readln(m,n); for t:=1 to n do a[t]:=0; f:=0;t:=0;s:=0; writeln('shunxu is'); repeat t:=t+1; if t=n+1 then t:=1; if a[t]=0 then s:=s+1; if s=m then begin s:=0; write(t,''); a[t]:=1; f:=f+1; end; until f=n; readln; end. 用a[] 来记录每个人的状态 a[i] = 0 表示第i个人还没有出圈 a[i] = 1 表示第i个人已经出圈 s 来计数 每次数到还没出圈的人 s:=s+1 , 当s = m 的时候就让这个人出圈 f 记录已出圈人数 f = n 的时候就退出循环
  • 2楼网友:上分大魔王
  • 2021-04-28 16:51

int f(int n) //n 表示第几项

{

if(n==1||n==2)

{

return 0;

}

else

{

return f(n-1)+f(n-2);

}

  • 3楼网友:洎扰庸人
  • 2021-04-28 15:52
VAR i,k,m,s:longint; f:boolean; function c(r:integer):boolean; var re:integer; begin re:=(s+m-1)mod r; if (re>=k) then begin s:=re; c:=true; end else c:=false; end; begin read(k); m:=k; while not f do begin f:=true;s:=0; for i:=0 to k-1 do if (not c(2*k-i))then begin f:=false; break; end; inc(m); end; writeln(m-1); end.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯