请问这个问题要怎么做呢,能否提供一下思路和标准代码

有N个人围成一圈,顺序排号。

从第一个人开始报数,凡是报数中的尾数为3,或能被3整除,就退出圈子。

问最后留下的是原来第几号的人,最后报数报到多少?

比如:N=3,3个人,从第1号开始,从1开始报数

报数:1 2 3 4 5 6 7

编号:1 2 3(退出) 1 2 1(退出) 2(只剩最后一个人)

最后报数最高是7,剩下的人编号是2

编写代码,要求:

1)用数组保存游戏参加人列表(最多不超过N)

  int LOOP[N];

2)数组取值为1或0,其中1代表参加报数,0代表被淘汰(1 TRUE / 0 FALSE)

3)键盘输入参加人数(人数<N)

4)编写函数处理游戏逻辑,输入指针(数组名)和参加人数(实际参加人数),输出报数最高值和最终胜利人编号

  int loops(int* p, int nums, int* top, int* id);

  p为输入指针,nums为输入人数,top为返回的最高值,id为返回的最终剩下的人编号

5)打印输出最高值和胜利者编号

其中:

1)函数内用 指针++ 操作遍历参加人

2)函数内用 指针赋值 操作完成从队尾到对头的循环

示例:

input: 3

output: id=2, top=7

img


给你写出来了


#include<stdio.h>
#define N 50

void main()
{
    int group[N];
    int totalNum = 0, restNum = 0, count = 0, roundcount = 0; 

    scanf("%d", &totalNum);

    //排号操作
    for (int i = 0; i < totalNum; i++)
    {
        group[i] = i + 1;
    }
    
    restNum = totalNum;

    //只要不只剩下一个人,那么就重复报数
    while (restNum>1)
    {
        roundcount = 0;
        //遍历整个数组,重复报数,直到一轮结束
        while (roundcount < totalNum)
        {
            if (group[roundcount]!=0)
            {
                count++;
                //报到3重头报数
                if (count == 3)
                {
                    group[roundcount] = 0;//退出的人以0为标识
                    restNum--;
                    count = 0;
                }                
            }
            roundcount++;
        }
    }

    for (int i = 0; i < totalNum; i++)
    {
        if (group[i]!=0)
        {
            printf("%d", group[i]);
            break;
        }
    }
}


写一个二维数组,第一行列出人数编号
第二行列出第一行-3的倍数编号的人之后的编号
...以此类推