题目链接:P1145 约瑟夫
程序说明:
从第 i 个人开始报数,下一个被杀掉的人的编号是 i+m-1 。需要模除总人数以防止溢出。
注意下标从0开始。
代码如下:
#include <iostream>
using namespace std;
int k;
int main() {
cin>>k;
int m = k + 1; //m最小值是k+1
while(true) {
int p = 0; //p指向被杀掉的人
for(int i = 0; i < k; i++) {
p = (p + m - 1) % (2 * k - i);
if(p < k) break; //杀掉的是前k个人,即杀掉了好人
if(i == k - 1) {
cout<<m;
return 0;
}
}
m++;
}
return 0;
}