C++解题:猴子选大王

一群猴子要选新猴王。新猴王的选择方法是:让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版权协议,转载请附上原文出处链接和本声明。