c语言约瑟夫问题练习

有50人围成一个圈,按顺序编号,从第一个人开始报数(从1到m报数,m>=2),凡是报到m的人退出圈子,问最后留下的那位的原编号。

#include<stdio.h>
int main(){
    int sz[50],m;
    for(int i=0;i<50;i++){
        sz[i]=i+1;
    }
    printf("输出你想要去除的数:\n");
    scanf("%d",&m);
    int *p,*pl;
    p=sz;
    pl=sz+50;
    int i=1;
    while(1){
        for(;;p++){
            if(p==pl){
                p=sz;
            }
            if(i==m){
                *p=0;
                i=0;
            }
            if(*p!=0) i++;
        }
        int sum;
        for(sum=0;p<pl;p++){
            if(*p!=0){
            sum+=1;
            }
        }
        if(sum==1) {
            break;
        }
    }
    for(int i=0;i<50;i++){
        if(sz[i]!=0) printf("%d",sz[i]);
    }
    return 0;
}

无法跳出循环

  for(;;p++){
            if(p==pl){
                p=sz;
            }
            if(i==m){
                *p=0;
                i=0;
            }
            if(*p!=0) i++;
        }

这天生就是个死循环啊。你都没有任何结束条件