希望为我解答疑惑,我实在不晓得为什么呀

好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。题目输入包括若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码,报数密码可能为1,题目要求按出队列顺序输出他们的编号。
#我遇到的问题
我用了一个小测验,就是二次循环往回走的时候,输出结果总是不对,我实在是不知道这是为什么了

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int tmp = 0;
    int count = 5,f=0,M=5,N=2;
    int i = 0,j=0,h;
    int *arr = (int *)malloc(sizeof(int)*M);
    int *brr = (int *)malloc(sizeof(int)*M);
    for(h=1;h<=2;h++){
        
    if(f==0){
    for(i= 0;i < M;i++)
    {
        arr[i] = i+1;
    }}
    i = 0;j=0;
    f++;
    count=5;
    while(count > 0)
    {
        if(arr[i]==0) goto end;
        if(j<M)
        {
            tmp++;
            if(tmp == N)
            {
                count--;
                brr[j] = arr[i];//printf("%d",i);
                printf("%4d",brr[j]);
                arr[i]=0;
                j++;
                tmp = 0;
            }

        }
    end:
        i++;
        if(i==M) i=0;
        
    }N++;
//    if(f==flag){
    for(i = 0; i < M;i++)
    {
            printf("%4d",brr[i]);
    }//}
    printf("\n");
    arr=brr;

    }
    
    return 0;
}

理清思路:1.参加游戏的人实际上是从1-M的自然数数列,循环赋值即可。2.输入人数,密码可存入同一数组或分开存放。
3.嵌套循环判定对应密码输出即可。