题目描述
有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?
该题目是c程序设计课本上的一道课后习题,今天刚好做到,在此分享一下我的解法。
题目解析
首先,我们需要弄一个数组,来表示人,1代表人还在位置上,0代表人已经退出圈子。
由于题目的要求是人是围圈一直报数,因此我们需要判断报数是否已经到了最后一个,要是人到了最后一个,需要重置回数组的第一个元素。
另外,需要判断当前的座位是否有人,要是没人,就直接跳过当前位置。要是有人,报数+1。然后判断报数的数字,是否报到3,如果报了3,将当前数组的元素赋为0,并且将报数重置为1。
循环结束条件是,当前的数组只剩一个元素为1,我们可以设置一个变量专门记录剩余人数,每当坐下一个人,剩余人数减一。
代码
#include<stdio.h>
#include<stdlib.h>
void main(){
int people[5]={0}; //n变量代表有n个人
for(int i=0;i<5;i++){ //给people变量赋值1,代表当前的人还在报数,0则代表该位置的人已经空了
people[i]=1;
}
void sort(int people[5],int n);
sort(people,5); //需要n传入有多少人参与排序
system("pause");
}
void sort(int people\[5\],int n){
int now=1,least=n,now_people=0; //now变量代表是当前的报数为多少,least变量表示当前当前剩余的人数,now_people是指当前轮到哪个人报数
do{
if(now_people\>n-1){ //判断当前轮到的人是否超出最多人数,如果超出,则变成0
now_people=0;
}
if(people\[now_people\]==0){ //如果当前为空,就往前加一个
now_people++;
}else{ //如果当前不为空
if(now==3){ //如果报数是三,那么当前的元素就变成0
people\[now_people\]=0;
least--;
now=1; //重置报数
}else{
now++;
}
now_people++;
}
}while(least\>1); //当人数仅剩一人的时候跳出循环
for(int i=0;i<n;i++){ //输出唯一的属性为1的元素
if(people[i]==1){
printf("%d",i+1); //输出是剩下的是第几个人
}
}
`}`