题目
题意理解
经思考,发现可以这么理解题意:有2m个人,然后进行报数,相当于前一个数字加上k,若结果大于m且小于等于2m,则为坏人,则需要总人数-1,即坏人还剩m-1人;若出现结果大于等于1且小于等于m的,则该k值不符合需求,需要将k++。直至坏人总数为0。
- 需要注意的是,在不断地取余过程中,会出现0这个数,所以,我们最好用0来代替2m的意思
- 此外,需要特别注意的有一点,就是每次加上k进行取余的过程中,需要注意原先位置是不是0,若是,则不许奥倒退(即减一),否则需要先倒退(即减一)后再进行取余,计算下一个位置
源码
#include <stdio.h>
int main() {
int m, n, k, rest, pos;
while (scanf("%d", &m) != EOF) {
n = m * 2;
rest = m;
k = m;
pos = k % n;
while (rest != 0) {
rest = m;
n = m * 2;
k++;
pos = k % n;
while (pos > m && pos < n || (pos == 0 && rest != 0)) {
n--;
rest--;
//
if (pos == 0) { /*此情况易忽略*/
pos = (pos + k) % n;
}
else {
pos = (pos - 1 + k) % n;
}
//
//pos = (pos - 1 + k) % n; /*很容易写成这个情况*/
}
}
printf("%d\n", k);
}
return 0;
}