n个人围个圈,k是个起始位置,点到m个,那人出去

下一轮k是出去那人的后面一个。

也就是说让k一直循环就行了。

由于固定数组遍历会遍历到0这些不在队中的人,需跳过他们,从1这些在队中的人开始

#include<stdio.h>
int main(){
    int n,k,m;
  //先赋好值
    scanf("%d %d %d",&n,&k,&m);
  //n个人
    int p[n];
  //都先设置为1,在队中的状态
    for(int i=0;i<n;i++){
        p[i]=1;
    }
  //队中尚存的人数
    int cnt_p=n;
  //点人的计数器
    int cnt_p1=1;
  //点人开始,退出循环时只剩一人。
    while(cnt_p>1){
      //从队中存在的人开始
        if(p[k]==1){
          //开始计数,到m退出
            while(cnt_p1<m){
                k=(k+1)%n;
              //存在的人才能计数
                if(p[k]==1){
                    cnt_p1++;
                }
            }
            //点到m个,此时k为出队人,设置出队状态
            p[k]=0;
          //队中人数减一
            cnt_p--;
          //再找下一个存在的人开始
            do{
                k=(k+1)%n;
            }while(p[k]==0);
            //此时k为下一个起始者
          //重置点人计数器
            cnt_p1=1;
        }
    }
  //遍历,输出存在的人
    for(int i=0;i<n;i++){
        if(p[i]==1){
            printf("%d",i);
        }
    }
}