今天我们要写的是“猴子选大王”,一道经典到不能再经典的C++编程题。

有 n 只猴子围成一圈,从 1 - n 编号,大家决定从中选出一个大王。经过协商,决定选大王的规则为:从编号为1的猴子开始报数,报到 k 的猴子出圈,然后再从下一只开始继续报 1 到 k ……,最后剩下来的那一只就是大王。要求编程从键盘输入 n、k ,输出成为大王的猴子编号。

【输入】

一行两个正整数 n 和 k 

【输出】

一行一个正整数,代表猴王的编号

【样例输入】

3 2

【样例输出】

3

题解:

一般人的代码:

#include <stdio.h>
int main()
{
    int N;
    int a[1000];
    scanf("%d", &N);
    int count = 0, number = N;
    for (int i = 0; i < N; i++)
        a[i] = i + 1;
    while (number > 1)
    {
        for (int i = 0; i < N; i++)
        {
            if (a[i] == 0)
                continue;
            count++;
            if (count == 3)
            {
                a[i] = 0;
                count = 0;
                number--;
            }
        }
    }
    for (int i = 0; i < N; i++)
        if (a[i] != 0)
            printf("%d", a[i]);
 
    return 0;
}

高手的代码(多想一会)

#include<iostream>
using namespace std;
int main()
{
    int n,m,k,r,q;
    cin>>n>>k;
    m=n*k;
    while(n>m)
    {
        r=(m-n)%(k-1)l
        if(r==0)
            r=k-1;
        q=(m-n-r)/(k-1);
        m=k*q+r;
    }
    cout<<m;
    return 0;    
}

大佬的代码(就是我)

#include<iostream>
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    int i,ans=0;
    for(i=2;i<=n;i++)
        ans=(ans+k)%i;
    cout<<ans+1;
    return 0;
}

有图有真相(注意代码长度)