wdsakljdlkfja 2023-07-16 12:18 采纳率: 75%
浏览 87
已结题

类似约瑟夫问题c++

沃瑟夫问题
有 n 个人排成一圈,从 1 到 n 编号。从第一个人开始依次报数(第一个人报的数是 1,下一个人报的数是 2...,当前这个人报的数字等于前面那个人报的数字加一),报数一共进行 n 轮,对于第 i (1<=i<=n) 轮,数到 i^2 的人出列,下一个人继续从 1 开始报数。结束的时候所有人都会出列。
请依次输出每一轮出列的人的编号。

输入格式
第一行一个整数 n
输出格式
输出一行,包含 n 个数,表示每一轮出列的人的编号

样例输入

10

样例输出

1 5 6 8 9 10 2 3 4 7

数据规模
对于 100% 的数据,保证 1≤n≤5000。

以下是我的代码
但是超时了,帮帮我怎样才能优化一下qwq

#include <iostream>
using namespace std;

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

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

  • 写回答

6条回答 默认 最新

  • 睡觉觉觉得 2023-07-20 14:31
    关注
    
    #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;
    }
    
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 7月30日
  • 专家已采纳回答 7月22日
  • 创建了问题 7月16日