约瑟夫问题拓展,约瑟夫问题拓展


#include <bits/stdc++.h>
using namespace std;
const int se = 5001;
int n, m, q[se + 1], front = 1, rear = se;
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        rear = rear % se + 1;
        q[rear] = i;
    }
    int x = 0, k = 1, psum = 0;
    while (rear % se + 1 != front) {
        psum = n - k + 1;
        ++x;
        int y = q[front];
        front = front % se + 1;
        m = k * k % psum;
        if (m == 0) {
            printf("%d ", q[rear]);
            ++k;
        } else {
            if (x == m) {
                printf("%d ", y);
                x = 0;
                ++k;
            } else {
                rear = rear % se + 1;
                q[rear] = y;
            }
        }
    }
    return 0;
}

哪位big佬帮忙看一下哪里错了
约瑟夫拓展

输入:10
输出:1 5 6 8 9 10 2 3 4 7

【以下回答由 GPT 生成】

根据代码和问题描述,这里给出代码中的错误和具体解决方案:

  1. rear = rear % se + 1; 这一行在每一次循环中,rear的值会超过数组q的大小,导致越界,并且会影响到后面的计算。

解决方案:根据约瑟夫问题的要求,当rear超过se的时候,应该重新赋值为1,而不是rear = rear % se + 1。可以修改为 rear = rear == se ? 1 : rear + 1;

  1. while (rear % se + 1 != front) 这一行在循环条件中使用了rear和front,但是这两个变量的值在循环体中被改变,导致循环的判断条件不准确。

解决方案:可以新增一个变量current_rear,在每次rear改变的时候将其值赋给current_rear,然后在循环条件中使用current_rearfront进行比较。

  1. m = k * k % psum; 这一行计算m的值有问题,psum的值在每次循环中应该是不断减少的,而不是固定不变的n-k+1。

解决方案:将psum的赋值放在循环体内部,在每次计算m的时候使用当前的n - k + 1的值。

  1. printf("%d ", q[rear]); 这一行在输出结果时,应该输出的是经过处理后的数列值,而不是输出rear所在位置的数。

解决方案:将这一行修改为 printf("%d ", q[front]);

修改后的代码如下:

#include <bits/stdc++.h>
using namespace std;
const int se = 5001;
int n, m, q[se + 1], front = 1, rear = se;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        rear = rear == se ? 1 : rear + 1;
        q[rear] = i;
    }
    int x = 0, k = 1;
    while (rear != front) {
        int current_rear = rear;
        int psum = n - k + 1;
        ++x;
        int y = q[front];
        front = front == se ? 1 : front + 1;
        m = k * k % psum;
        if (m == 0) {
            printf("%d ", q[front]);
            ++k;
        } else {
            if (x == m) {
                printf("%d ", y);
                x = 0;
                ++k;
            } else {
                rear = rear == se ? 1 : rear + 1;
                q[rear] = y;
            }
        }
        rear = current_rear;
    }
    return 0;
}

经过以上修改,代码中的错误应该已经解决了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^