约瑟夫问题的两种解法

要用c语言的方法解决,一种数组,一种循环链表

第1个回答  2008-04-07
【约瑟夫问题】
编号为1,2,......,n的n个人按照顺时针方向围坐一圈。从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。其中n,m由键盘输入。
【思路1】
利用数组存放n个人,数组下标等于他的编号,然后模拟报数过程,报到m时输出该位置的人编号,然后该位置的值清0,继续报数并判断是否为0,是0则跳过。直到n个人全部出列为止。
【参考程序】
Program yueshefu;
Var
a:array[1..100] of integer;
n,m,i,j,p:integer;
Begin
write('Input n,m:');
readln(n,m);
for i:=1 to n do
a[i]:=i;
p:=1; {p用于记录报数的位置}
for i:=1 to n do
begin
j:=0; {j用于记录报到的人数}
while j<m do
begin
if a[p]<>0 then j:=j+1;
if p=n then p:=1 else p:=p+1; {处理边界情况}
end;
if p<>1
then begin write(a[p-1],' ');a[p-1]:=0;end {处理边界情况}
else begin write(a[n],' ');a[n]:=0;end;
end;
end.

--------------------------------------------------------------------------------

【思路2】
建立一个循环数组,数组元素的每一个值保存的是它的下一个元素的编号,如果报到m后只要修改m前面的元素的编号为m后面的元素的编号,这样就跳过了第m个元素,如此下去直到n个人全部出列。
【参考程序】
Program yuesefu;
Var
a:array[1..100] of integer;
n,m,p,i,j:integer;
Begin
readln(n,m);
for i:=1 to n-1 do
a[i]:=i+1;
a[n]:=1;
p:=n;
for i:=1 to n do
begin
for j:=1 to m-1 do
p:=a[p];
write(a[p],' ');
a[p]:=a[a[p]];
end;
End.

参考资料:http://www.zjtg.cn/itjs/pascaljx/4_4.asp

约瑟夫问题的两种解法
【约瑟夫问题】编号为1,2,...,n的n个人按照顺时针方向围坐一圈。从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。其中n,m由键盘输入。【思路1】利用数组存放n...

约瑟夫问题
问题1: 假设我们已经知道11个人时,胜利者的下标位置为6。那下一轮10个人时,胜利者的下标位置为多少? 答: 其实吧,第一轮删掉编号为3的人后,之后的人都往前面移动了3位,胜利这也往前移动了3位,所以他的下标位置由6变成3。问题2: 假设我们已经知道10个人时,胜利者的下标位置为3。那下...

这或许是你能找到的最详细约瑟夫环数学推导!
解决约瑟夫环问题,可以采用倒推方式,即从最终状态反推原始状态。具体思路是,如果知道最后剩下的数字在最终序列中的位置,那么可以计算出它在原始序列中的位置。假设最后剩下的数字下标为x,那么在原始序列中它的位置可以通过特定公式计算得出。大部分解法到这里就结束了,但缺乏数学证明过程。现在我们详细...

小约瑟夫是什么意思?
小约瑟夫问题的计算方法主要包括递推公式、递归法和数学公式三种。其中,递推公式是典型的动态规划方法,迭代速度较快;递归法则是递归式描述问题,完全遵循问题的定义,代码简单易懂;数学公式则是求解问题的一种通用方法,对于大量数据、极多人数情况较为有效。不同的方法有着不同的特点和适用范围,具体使...

约瑟夫问题
杀2留1,即1,2,1,2报数,报1的人留下,报2的人死。约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。假定在圈子里前K个为好人,后K个为坏人,你...

JOSEPHUS 好人 求算法思路,最好有代码
*问题分析与算法设计 约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。 题目中30个人围成一圈,因而启发我们用一个循环的链来表示。可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在...

有n个人围成一圈,顺序排号。凡报到3的人退出圈子,问最后留下的是原来...
这是约瑟夫环的数学解法(迭代法)的公式,我们可以这样理解 把n个人想成标号从0开始到n-1的n个人,报到3的人退出圈子,那么退出圈子的人在0到n-1的标号为(k+3)%n(其中k为n-1个人时退出圈子的人的标号)因为有一个人退出了圈子,所以还剩下n-1个人,我们对剩下的人重新从0到n-2编号,同样有公式(...

约瑟夫斯的著名的约瑟夫斯问题
他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。解法约瑟夫问题可用代数分析来求解,将这个问题扩大好了,假设现在您与m个朋友不幸参与了这个游戏,您要如何保护您的朋友?只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆内圈是排列顺序,而外圈是自杀顺序,如下图所示:

拉格朗日乘数法解法
拉格朗日乘数法解法:在数学最优问题中,拉格朗日乘数法(以数学家约瑟夫·路易斯·拉格朗日命名)是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。这种方法将一个有n个变量与k个约束条件的最优化问题转换为一个有n+k个变量的方程组的极值问题,其变量不受任何约束。这种方法引入了一种新的...

约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈...
共有三种解法:我先给你一个同密码,循环链表写的吧!欢迎采纳并追问!include <stdio.h> include <stdlib.h> int linktype(int n,int m) \/\/链表结构 { int people,passord;struct node { int data;struct node *next;}NODE;node *p,*head,*q,*pri;head=(node *)malloc(sizeof(struct ...

相似回答
大家正在搜