猴子选猴王问题,请高手指教下
N只猴子选猴王,方法如下:从头到尾1、2、3报数凡是报3的退出,余下的从尾到头报数,凡是报3的退出。余下的又从头到尾报数,还是报3的退出;以此类推,当剩下两只猴子时,取这时报数报1的为王。要想当猴王,最初应占据什么位置?
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"; }