被叔叔带人轮流上:用数组方法解决约瑟夫问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 15:57:03
。(即:13个人围成一圈,分别编号为1-13,从第一个人开始报数,报到3的人出圈,后面的人继续从1开始报数,重复前面的过程,问最后一个出圈的人是几号。)

不好意思,开始没看清题,以为编号是0到12,修改后如下:
#include<stdio.h>
/*有13个人围成一圈(编号为1~13),从第1号的人开始从1报数,凡报到3的倍数的人

离开圈子,然后再数下去,直到最后剩下一个人为止,问此人原来的位置是多少号?*/
main()
{
int a[14];
int i,c,count=0;
for(i=1;i<14;i++)
{
a[i]=i;
}
i=1;
c=0;
a[0]=EOF;
while(c<12)
{
if(a[i]!=EOF)
{
count=count+1;
if(count==3)
{
a[i]=EOF;
c++;
count=0;
}
}
i=(i+1)%14;
}
for(i=1;i<14;i++)
{
if(a[i]!=EOF)
{
printf("the last one is:%d\n",a[i]);
}
}
getch();
}

main()
{
int a[14],i,j,t;

for( i=0;i<14;i++){
a[i]=i;
}

i=1;

for( j=1;j<=13;j++){
for( t=0;t<3;t++){

if(i==14){
i=1; //循环一周从头开始.
}
if(a[i]==14){
t--; //此人已经被删除,不用再查.
}

if(t==2){
printf("%d\n",a[i]); //输出被删除人.
a[i]=14; //对被删除的人做标记.
}
i++;
}
}
}
运行时把注释去了

需要使用递归,定义一个数组,传到递归函数中,递归函数依次删除为下标3倍数的数值,形成一个新数组,在递归中调用自己继续计算。

#include<iostream.h>

class Node
{
public:
int flag;
int data;
Node * next;
};

void main()
{
int n,m,i,count=0;
Node * p,* pp,* Head,*pre;
cout<<"请输入n:"<<endl;
cin>>n;

cout<<"请输入m:"<<endl;
cin>>m;

Head =new Node;
Head->next=NULL;
Head->flag=1;
Head->data=1;
p=Head;

for(i=0;i<n-1;i++)
{
pp=new Node;
p->next=pp;
p=p->next;
p->flag=1;
p->data=i+2;
}
p->next = Head;

pre=p=Head;
i=1;
for(;;)
{
if(p->flag==1)
{
if(i==m)
{
p->flag=0;
i=0;
count++;
if(count==n-1)
break;
}
i++;
}
pre=p;
p=p->next;
}

for(i=0;i<n;i++)
{
cout<<Head->flag;
if(Head->flag==1)m=Head->data;
Head=Head->next;
}
cout<<endl<<"最后剩下的是第"<<m<<"位."<<endl;
}