用c语言来解决约瑟夫问题

问题;假设有30个人 报到三的人出局 按顺序输出出局的人
怎么让一个循环 让每一次 出局的人 在循环中被略过去 我设了 now:当前的人的编号 pre 当前的人的前一个活着的人的编号 a【i】:是当前人的下一个活着的人的编号

建立一个30大小的数组,数组值就是0或1。1表示已经出局的。那么循环过程中,如果数组值为1,就忽略
报到三的人,将数组值设置为1。如果某次扫描完30个数组元素,发现没能淘汰人,那么循环就结束了

代码如下:

#include<stdio.h>
#define MAXN 30
void CountOff(int n,int m,int out[]);

int main()
{
    int i,n,m,out[MAXN];
    scanf("%d %d",&n,&m); //n是总人数,m是报的数
    CountOff(n,m,out);
    for(i = 0;i<n;i++)
    {
        if(out[i] == 0)
            printf("%d",i+1); // 编号从1开始
    }

    return 0;
}

void CountOff(int n,int m,int a[])
{
    int i,t=n,k=0;//t表示剩余人数
    for(i=0;i<n;i++)
        a[i] = 0;
    while(t!=1)
    {
        for (i=0;i<n;i++)
        {
            if(a[i]==0)
            {
                k++;
                if(k%m==0)
                {
                    k = 0;
                    a[i]=1;
                    t--;
                }
            }
        }
        //显示过程
        /*for(int k=0;k<n;k++)
            printf("%d ",a[k]);
        printf("\n");*/
    }
}