顺序排号,依次报数到3退出,循环报数,求最后一个原本次序

问题遇到的现象和发生背景

有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下的是原来第几号的的那位。

用代码块功能插入代码,请勿粘贴截图
#include 
int main()
{
    int a[20][20], n, i, j, b,m;
    printf("请输入总人数:");
    scanf_s("%d", &n);
    for (i = 0;i < n;i++)
    {
        for (m = 0;m < n;m++)
        {
            if (m == i + 1) a[i][m] = 1;
            else a[i][m] = 0;
        }
        
    }
    for (i = 0;i < n;i++)
    {
        if (((i + 1) % 3 == 0)||a[i][m]==1 )
        {
            n = n - 1;
            for (j = i;j < n;j++)
            {
                a[j][m] = a[j + 1][m];
            }
        }
        else if (n <3)break;
    }
    for (i = 0;i < n;i++)
    {
        for (m = 0;m < 20;m++)
        {
            if (a[i][m] == 1)   printf("剩下的人的次序是:%d", m);
        }
    }
    return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

我的思路是用二维数组列坐标标识原本的次序,筛选完毕后输出m,求纠错,我自己看看不出来

你定义两个一样大小的数组就好了,n代表数组大小。你的二维数组用的让人看不懂

#include <stdio.h>
int main()
{
    int a[100] = {0},n,out= 0;
    scanf("%d",&n);
    int i=0,c=1;
    while(n-out>1)
    {
        if(a[i] == 0)
        {
            if(c%3==0)
            {
                a[i] = 1;
                c=1;
                out++;
            }
            else
                c++;
        }
        i = (i+1)%n;
    }
    for(i=0;i<n;i++)
        if(a[i] == 0)
            printf("剩下的人的次序是:%d\n",i+1);
    return 0;
}