13、围圈报数问题
有n个人围成1个圈,顺序编号,从第1个人开始报数,从1报到5,凡是报到5的退出圈子,问最后留下的人原来是几号?
#include<stdio.h>
int left(int a[], int n);
int main(){
int n, i;
scanf("%d", &n);
int a[n];
//给每一个人编号
for(i=0;i<n;i++){
a[i]=i+1;
}
printf("%d", left(a,n));
return 0;
}
int left(int a[], int n){
//num当前在场剩余人数,cnt为当前报数
int i=0, num=n, cnt=0;
while(num!=1){
if(a[i]!=0){ //a[i]!=0表示a[i]在场,则报数
if(++cnt == 5){ //若a[i]报的数为5,则使a[i]=0,表示a[i]已退场
a[i]=0;
num--;
cnt=0; //++cnt == 5要与cnt = 0 搭配
}
}
if(++i == n)i=0; //若++i==n,即i指向圈尾的后一个位置即圈开头,则i=0使i指向圈开头
}
//注意必须遍历数组才能找出还在场的那个人
for(i=0;i<n;i++){
if(a[i]!=0)return a[i];
}
}