您的位置:首页 > 其它

约瑟夫问题(猴子选大王)

2014-09-11 22:03 447 查看
问题描述

约瑟夫问题:有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
#define MaxSize 1024
int jose(int mon[],int n,int m)
{
int b[MaxSize];
int count=0;    //count是记录退出圈外的猴子个数
int i=-1;        //从0号位置的猴子开始计数
int k;
int d;
for(k=0;k
{
mon[k]=k+1;    //设置猴子的编号
}
while(count
{
d=0;
while(d
{
i=(i+1)%n;    //循环选取
if(mon[i]!=0)
d++;
}
b[count]=mon[i];     //将出列的猴子存至数组b中
mon[i]=0;
count++;
}
// for(i=0;i
// {
//  printf("%d ",b[i]);
// }
return b[n-1];
}
void main()
{
int n,m;
int king[MaxSize];
int i=0,j,num=0;
int mon[MaxSize];
printf("输入n和m的值:\n");
while(scanf("%d %d",&n,&m)==2)
{
if(m==0&&n==0)
{
break;
}
else
{
king[num]=jose(mon,n,m);
num++;
}
}
printf("输出最后猴王的编号:\n");
for(j=0;j
printf("%d\n",king[j]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: