约瑟夫问题
问题描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号
开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,
直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编
号。
输入数据
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行
是:
0 0
输出要求
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
输入样例:
6 2
12 4
8 3
0 0
输出样例:
5
1
7
数组实现:
#include <stdio.h>
void main()
{
int m,n;
scanf("%d%d",&m,&n);
int a[1000];
for(int i=0;i<m;i++)
{
a[i]=1;
}
int index=0;//猴子索引
int loc;//记录位置
int t=0;
int p=m;//还剩猴子数
while(p>0)
{
if(a[index]==1)
{
++t;
if(t%n==0)
{
a[index]=0;
loc=index;
p--;
}
}
if(index < m-1)
index++;
else
index=0;
}
printf("%d\n",loc);
}
链表实现:
#include <stdio.h>
struct Monkey
{
int i;
Monkey * next;
};
int main()
{
int n,t;
scanf("%d%d",&n,&t);
Monkey * head,* curr;
curr=NULL;
head=NULL;
Monkey *m=new Monkey;
m->i=0;
head=m;
curr=m;
for(int i=1;i<n;i++)
{
Monkey *m=new Monkey;
m->i=i;
curr->next=m;
curr=m;
}
curr->next=head;
int p=1;
while(curr->next!=NULL)
{
if(curr->next->next==curr->next)
{
printf("%d\n",curr->next->i+1);
break;
}
if(p==t)
{
Monkey *t=curr->next;
curr->next=curr->next->next;
delete t;
p=1;
}
p++;
curr=curr->next;
}
return 0;
}
浙公网安备 33010602011771号