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);
}
}
}