有n个人围成一圈报数问题

问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
为什么我这个代码运行不出结果呀?

#include
using namespace std;
int  main()
{
    int n;//最开始的总人数 
    int i;//控制变量 
    cout<<"请输入有多少人参加游戏"<<'\n';
    cin>>n; 
    int s[100];//定义一个数组 
    int j=0;//总共退圈人数 
    int y;// 每轮退圈人的号码 
    int cout=0;//每轮报号累加数 
    for(i=0;i1;//1在圈内,0在圈外,所有人都在圈外时停止循环 
    }
    while(jfor(i=0;iif(s[i]==1)
            {
                cout++;
                if(cout%3==0)
                {
                    s[i]=0;
                    j++;
                    y=i+1;
                }
            }
        }
    }
    cout<'\n';
            return 0;
} 

我实在没理解的逻辑。我写了一个,带有详细注释,供您参考。如果有用望采纳。

#include <stdio.h>

int main() {
    int m, n;
    scanf("%d %d", &n, &m); // n人数,m是报数

    if (m <= 0 || n <= 0) {
        printf("输入数据不合法\n");
        return -1;
    }
    int a[n + 1];
    for (int i = 1; i < n; i++)
        a[i] = i + 1;
    a[n] = 1;
    int pos = 1;                    // 表示最先从编号为1的人开始数,pos表示当前数到的人的序号
    int cnt = 1;                     // 表示当前数到第几个,因为第一个已数过,故cnt=1
    while (a[pos] != pos) {   // a[pos]!=pos 说明下一个不是自己本身,即人数>=2个,游戏继续
        cnt++;                        // 数的人加1,即将序号为a[pos]的人已经数过
        if (cnt == m) {             // 当cnt=n时,说明该人要出圈
            a[pos] = a[a[pos]]; //pos位的直接后继(a[pos]) 改为 a[pos]位的直接后继(a[a[pos]])
            pos = a[pos];         //继续向后数,当前数到的是序号为更新后的a[pos]的,cnt计数为1
            cnt = 1;
        } else {
            pos = a[pos]; //如何不是第n个,继续往后数,将pos向后移动
        }
    }
    printf("最终留下%d号\n", pos);

    return 0;
}


1.while(j<n)和for(i=0;i<n;i++)功能重复了,它俩不能嵌套使用
2.内层应该是个while循环,以保证当数到尾的时候能够从头开始数
3.if(cout%3==0)在执行之后,应该跳出内层循环,以保证踢人动作只会执行n-1次
4.j<n应该改为j<n-1,否则一共n个人踢出去n个人,都踢出去了