13、多くの問題は、エンクロージャを報告しました
ありnは個人がレポートを終了し、いくつかの数字であることが判明したまま最後を尋ね5を報告する1から最初の人、5円から、円でのgettin番号をシーケンス番号を囲ん?
#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];
}
}