约瑟夫问题——坏人必须死

题目

Image.png

题意理解

经思考,发现可以这么理解题意:有2m个人,然后进行报数,相当于前一个数字加上k,若结果大于m且小于等于2m,则为坏人,则需要总人数-1,即坏人还剩m-1人;若出现结果大于等于1且小于等于m的,则该k值不符合需求,需要将k++。直至坏人总数为0。

  1. 需要注意的是,在不断地取余过程中,会出现0这个数,所以,我们最好用0来代替2m的意思
  2. 此外,需要特别注意的有一点,就是每次加上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;
}
Contents
  1. 1. 题目
  2. 2. 题意理解
  3. 3. 源码
|