c++算法问题(围圈,数数退出)

来源:百度知道 编辑:UC知道 时间:2024/09/21 13:48:38
有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

怎么做?
越具体越好。。。THX

#include<iostream.h>

void main()
{
int m,n,i,j,k,p;

cout<<"请输入猴子个数:"<<endl;
cin>>n;
cout<<"请输入编号:"<<endl;
cin>>m;
int *a=new int[n];

for(i=0;i<n;i++)
a[i]=i+1;
cout<<"共有"<<n<<"只猴子,";
j=1;
p=1;
while(n>1)
{
if(j%m==0)
{
for(k=p;k<n;k++)
a[k-1]=a[k];
n--;
p--;
}
j++;
p++;
if(p>n)
p=1;
}
cout<<"数到第"<<m<<"个下去,剩下的是第"<<a[0]<<"号";
}

约瑟夫问题(一)
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
*问题分析与算法设计
约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。