一群猴子要选新猴王。新猴王的选择方法是:让M只候选猴子围成一圈,从某位置起顺序编号为1~M号。从第1号开始报数,每轮从1报到N,凡报到N的猴子即退出圈子,接着又从紧邻的下一只猴子开始重新报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
思路1:
利用数组int n[M],都初始化为1,淘汰的标记为0,往复循环操作,剩下最后一个数组元素1的下标+1即是答案。
参考代码:
#include <iostream>
using namespace std;
int whoIsMonkeyKing(int,int );
int main()
{
cout<<whoIsMonkeyKing(21,3)<<endl;
return 0;
}
int whoIsMonkeyKing(int m,int n) //m为猴子个数,n为最大报数
{
if(m<1 || n<1)
{
cout<<"输入参数错误"<<endl;
return -1;
}
int *p = new int[m];
int *q = p,M = m;
int res;
for(int i=0; i<m; i++)
{
p[i]=1;
}
while(M!=1)
{
int i=0;
while(i!=n)
{
if(q==p+m)
{
q = p;
}
if(*q++==1)
{
++i;
}
}
*(q-1) = 0;
--M;
}
for(int i=0; i<m; i++)
{
if(*(p+i)==1)
{
res = i+1;
break;
}
else
continue;
}
delete[] p;
return res;
}
思路2:
利用链表
版权声明:本文为ssspppfff原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。