C++语言编程问题求解疑

有12人围坐成一-圈玩报数游戏,从1号人员开始顺时针报数,报到3的人员被淘汰出局;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从1开始报数,报到3的人被淘汰;如此继续,直到最后只剩下一个人时停止。请编写程序输出最后所剩那个人的编号。

假设参加游戏的人的编号沿顺时针方向依次为1到12,可以使用数组来存放各数据;


#include <iostream>
using namespace std;
int main()
{
    int N,i,cnt=1,n;
    N=12;//cin >> N;
    n = N;
    int* p = new int[N];
    for(i=0;i<N;i++)
        p[i] = 0;
    while(n>1)
    {
        for(i=0;i<N;i++)
        {
            if(p[i]==0)
            {
                if(cnt%3==0)
                {
                    cnt = 1; //从1开始报数
                    n--;
                    p[i]=1;
                    //cout << i+1 << " ";
                }else
                    cnt++;


            }
        }
    }
    //输出最后一个
    for (i=0;i<N;i++)
    {
        if(p[i]== 0)
        {
            cout << i+1<<endl;
            break;
        }
    }
    delete[] p;
    p=0;
    return 0;
}

将12个人状态都设置为1,报数后改为0。循环统计三个人则第三个人状态改为0。直到最后只有一个人

#include<iostream>
using namespace std;
int main() {
    int a[13]={0},n=12,m=3,t=0,s=0,b=1;
    while(s!=n) {
        if(!a[b]) {
            t++;
            if(t==m) { 
                a[b] = 1; 
                s++;
                if(s==n)
                    cout<<b;
                t=0;
            }
        }
        b++;
        if(b>n)
            b=1;
    }
    return 0;
}