【pascal】求约瑟夫问题的递归求法(程序)
- 提问者网友:沦陷
- 2021-04-28 14:52
- 五星知识达人网友:低音帝王
- 2021-04-28 15:15
[解题分析]
用一个数组存储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
- 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