10.7约瑟夫问题

约瑟夫问题

模拟,构建一个循环队列,数组就行,如果有人就为1,没人则为0

memset复习

10.7约瑟夫问题_第1张图片

需要注意,在给整数数组赋值时,用memset赋值出来不是1,而是16开头的

10.7约瑟夫问题_第2张图片 所以这样会报错,因为数组里存的根本就不是1,

最稳妥还是用循环语句

  int nxt[105];
    int n, m;
    cin >> n >> m;
    for (int j = 1; j <= n; j++) {
        nxt[j] = j + 1;
    }
    nxt[n] = 1;
    int i = n;//i指的是当前这个人的前一个人
    while (n) {
        int t = 1;//把第一个人算上
        while (t < m) {
            t++;
            i = nxt[i];
        }
        cout << nxt[i]<<" ";//此时出来时就是最后一个人,
        nxt[i] = nxt[nxt[i]];
        n--;
    }

你可能感兴趣的:(算法,算法)