#c++#沃瑟夫问题,还是会出错,请专家解答

img


#include <bits/stdc++.h>
using namespace std;

const int size = 5001;
int n, m, q[size + 1], front = 1, rear = size;

int main() {

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

出错,大家指正指正

你可以提交这个代码


 
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n+1]={0};
    for(int i=1;i<=n;i++) a[i]=i; 
    int num=n;//num为剩余人数 
    int count=1;//count为当前要报的数字 
    int tmp=0;//tmp为当前该哪个位置报数了 
    int l=1;//l表示当前是第几轮 
    while(num!=0)    
    {
        tmp++;
        if(tmp>n) tmp=1;
        int val=pow(l,2);
        if(a[tmp]!=-1)
        {
            if(count==val)
            {
            cout<<a[tmp]<<" ";
            a[tmp]=-1;
            l++;
            num--; 
            count=0;
            }
            count++;
        }
        
        
    }
    return 0;
}

【以下回答由 GPT 生成】

这段代码的目标是解决沃瑟夫问题(Josephus problem),但是其中存在一些错误,我会逐个指出并给出修复建议。

  1. 文件包含问题:代码中使用了以下包含语句
#include <bits/stdc++.h>

这是一个非标准的包含语句,不建议使用。可以改为包含特定的标准库头文件,例如:

#include <iostream>
#include <cstdio>
  1. size命名冲突:代码中定义了一个名为size的变量,这可能与标准库中的size方法产生冲突。建议将变量名改为其他的无冲突的名称。

  2. 非法访问数组:代码中的队列使用了环形数组实现,但是在将rear指针减小时,没有考虑指针小于1的情况。建议在执行减小指针操作之前检查rear的值是否大于1。

  3. 数组越界访问:代码中使用q[rear]访问数组q的时候,没有检查rear是否超出了数组的范围。建议在访问数组元素之前检查rear的值是否在合法的范围内。

基于以上的问题和修复建议,下面是修复后的代码:

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 5001;
int n, m, q[N + 1], front = 1, rear = N;

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

希望这些修复建议可以解决你的问题。如果还有其他疑问,请随时提出。



【相关推荐】



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