一.题目内容
有N个人围成一圈(编号为1~N),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的编号是多少?
二.代码
#include<stdio.h>
int main(){
int N,i,flag=0,num=9;
int a[101]={0};
scanf("%d",&N);//num存储报数个数(本题应该为9)
if(N<101)
{
for(i=1;num>0&&num<N;i++)
{
if(a[i]==0)//最初a[i]都=0
{
flag++;//不是需要的值(3),flag就加1
if(flag==3)//一旦报3就执行
{
a[i]=1;//表示退出的人
num--;//剩余的人数-1
flag=0;//重新开始计数
}
}
if(i==N)//确保报数到9时能继续正确的报数
{
i=0;
}
}
for(i=1;i<=N;i++){
if(a[i]==0){
printf("余下的为:%d号\n",i);
break;
}
}
}
return 0;
}
三.内容分析
使用一个长度为n+1数组,并把每一个数组中的每一个值初始化为0即int a[11]={0},(此处以n=10为例)
用1~10表示所有报数的人,a[i]=0表示第i个人没报数,a[i]=1表示第i个人报数了,同时用int num=9来表示应该退出的人数,每退出一个人数就num--,num==0时则表示只剩下了一个人,此时让i遍历1~10,若a[i]=0,则此时的i即为剩下的人的位置,题目要求每三个人就退一个,即数组每过三个元素,就让该元素为1,围成一圈,因此到最后一个人要重新返回第一个,且会退出一个,即下次需要跳过元素为1的元素,.可以用一个flag来记录过了多少个元素.