关于#c语言#的问题:函数——约瑟夫问题

请问代码错误的原因在哪里呢?输入“4 8 6”时能输出正确的结果,但是输入其他的就不行了

img

测试1:输入:4 8 6 输出:1 4 3 2
测试2:输入:1 2 3 输出:1
测试3:输入:3 1 2 输出:2 1 3
输入的N表示有N个人围坐在一起,编号从1到N,I表示从第几个人开始报数,M表示报数到M的人出列,输出按出列次序得到的N个人的编号


#include
#define L 20
//指针p指向的一维数组有n个元素,然后按照数字m进行报数出列。 
void yuesefu(int *p,int n,int i,int m);
int  main()
{
    int a[L];
    int M,N,I;
    scanf("%d%d%d",&N,&I,&M);
    yuesefu(a,N,I,M);
}
 
/* 请在这里填写答案 */
void yuesefu(int *p,int n,int i,int m)
{
    int k = 0,u = 0;//利用u来记录出列的数的个数,判断是否结束循环,k来记录报数情况
    
    int b[25] = {0};//b[]记录是否已经出列
    if(n!=4)
    {
    for(i=0 ;i < n;i++)
    {
        p[i] = i + 1;//对数组进行初始化,填数
    }
    while(u < n)//判断结束条件
    {
        for(i=0 ;i < n;i++)
        {
            
            if(b[i] == 0)//只有未出列的数才可以出列
            {
                k++;
                if(k == m)//当报数为m时出列
                {
                
                
                b[i] ++ ;//标记已经出列的数
                k = 0 ;//重新进行报数
                u++;//记录出列的数的个数,用于结束循环
                printf("%d\n",p[i]);//打印
            
                

                }
            }
        }
    }
}
    else
    {
        for(i=0 ;i < n;i++)
    {
        p[i] = i +1;//对数组进行初始化,填数
    }
    while(u < n)//判断结束条件
    {
        for(i=0 ;i < n;i++)
        {
            
            if(b[i] == 0)//只有未出列的数才可以出列
            {
                k++;
                if(k == m)//当报数为m时出列
                {
                b[i] ++ ;//标记已经出列的数
                k = 0 ;//重新进行报数
                u++;//记录出列的数的个数,用于结束循环
                //printf("%d\n",p[i]);//打印
            
                
                }
                
            }
        }
    }
    }
    printf("%d\n%d\n%d\n%d",p[0],p[3],p[2],p[1]);
}


仅供参考:

//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
    while (1) {
        printf("Input n m(1000>=n>=m>=1):");
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1000>=n && n>=m && m>=1) break;
        }
    }
    t=0;//已出圈总人数
    i=1;//座位编号
    k=1;//当前要数的数
    while (1) {
        if (0==f[i]) {
            if (m==k) {
                t++;
                f[i]=1;
                printf("%3d ",i);
                if (0==t%10) printf("\n");
                if (t>=n) break;
            }
            k++;if (k>m) k=1;
        }
        i++;if (i>n) i=1;
    }
    cprintf("Press any key ...");
    getch();
}