求约瑟夫问题两种解法

来源:百度知道 编辑:UC知道 时间:2024/05/28 14:11:45
约瑟夫问题:
设有N个人围成一个圈,每个人的编号为1到N。从编号为K的人开始报 数,数到M的人出队,接着从出队的下一个人开始重新报数,数到M的人又出队,依此类推,直到所有的人都出队。求这N个人出队的顺序。
要求:用单链表和顺序表两种方式分别实现(用C语言描述)
现在我又想了一下,实在用c不好搞用C++也行。有用顺序表搞的吗?
对了,上面的那个程序有一个错误,但是电脑不能指出来,麻烦高人再弄一下,呵呵

编号为1,2,......,n的n个人按照顺时针方向围坐一圈,每个人有且只有一个密码(正整数)。一开始任选一个正整数作为报数上限值,从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。

用循环链表解决:
#include<iostream.h>
int Josephus(int *Child,int n,int m);
void main()
{
int *allChild,j,k,l;
cin>>j>>k;

if((allChild= new int[j])!=NULL)
{
for(l=0;l<j;l++)
{
cout<<l+1<<",";
allChild[l]=l+1;
}
cout<<endl;
cout<<Josephus(allChild,j,k);
}
}

int Josephus(int *Child,int n,int m)
{
int i=-1,j=0,k=1;
while(1)
{
for(j=0;j<m;)
{
i=(i+1)%n;
if(Child[i]!=-1)
j++;

}

if(k==n)
break;
cout<<Child[i]<<",";

Child[i]=-1;
k=k+1;

}
cout<<endl;
return(Child[i]);
}

看不懂cin>