注册 登录
编程论坛 C++教室

猴子选猴王问题,请高手指教下

大神仙下凡 发布于 2017-09-28 10:52, 1347 次点击
N只猴子选猴王,方法如下:从头到尾1、2、3报数凡是报3的退出,余下的从尾到头报数,凡是报3的退出。余下的又从头到尾报数,还是报3的退出;以此类推,当剩下两只猴子时,取这时报数报1的为王。要想当猴王,最初应占据什么位置?
1 回复
#2
rjsp2017-09-28 12:53
此论坛是禁止作业题的
若你在做题时有什么知识点不会,可以提出来,然后大家解答

以上是站长的规定,我是无所谓的,但你出题,起码要题目完整,即“示例输入、示例输出”是不可少的,让别人可以验证代码是否正确
比如 n == 5 时,输出 2
比如 n == 9 时,输出 7

程序代码:
size_t foo( size_t n, size_t m ) // n为开始时的总数,m为退出者报数。对于本题,m恒为3
{
    size_t r = 0;
    for( size_t i=3; i<=n; ++i ) // 题目要求“当剩下两只猴子时,取这时报数报1的为王”,所以i从3开始
        r = (r+m)%i;
    return r; // 返回序号 base 0。因为在算法中序号从1开始的,都是该杀的傻屄
}

#include <iostream>
using namespace std;

int main( void )
{
    cout << "2只猴子时,当占据第 " << foo(2,3)+1 << "位.\n";
    cout << "3只猴子时,当占据第 " << foo(3,3)+1 << "位.\n";
    cout << "4只猴子时,当占据第 " << foo(4,3)+1 << "位.\n";
    cout << "5只猴子时,当占据第 " << foo(5,3)+1 << "位.\n";
    cout << "6只猴子时,当占据第 " << foo(6,3)+1 << "位.\n";
    cout << "7只猴子时,当占据第 " << foo(7,3)+1 << "位.\n";
    cout << "8只猴子时,当占据第 " << foo(8,3)+1 << "位.\n";
    cout << "9只猴子时,当占据第 " << foo(9,3)+1 << "位.\n";
}

1