题目要求:
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
解题思路:
采用数组来存放所有的人数,并为所有元素(所有人)打上标记为T(true),记录全部人数赋值给sum,采用循环进行不断报数,每当一个人报数为3时,说明此人被淘汰,打上标记为F(false),当轮着一圈报完数后,重新从第一个人开始报数,进行淘汰,直至剩下最后一人时,跳出循环,通过标记T(true)来输出此人的序号(注意不是数组下标).
注意事项:
1.当一个人的标记为T(true)时,才可以进行报数,即 i 的不断累加。
2.当人数累加到数组上限时,即轮着报数已一圈,则数组变为0元素继续报数。
3.必须是先判断一个人的标记再进行操作,另判断标记应放在循环最前端,否则可能k累加范围超过数组上限仍进行判断导致程序出错。
源代码如下,仅供参考(鼓励多种思路解题):
#include<stdio.h>
int main()
{
int a,i=0,k=0,sum;
scanf("%d",&a);//输入数组总的长度,也就是a的个数;
sum=a;//将总人数a赋值给sum;
char score[a];//定义字符型数组score[a];
for(int j=0;j<a;j++) score[j]='T';//为这些元素全部附初值为T
while(sum>1)//进入while循环,当一个人对应i=3时,人数减去1.
{
if(score[k]=='T') i++;//若这个人没被淘汰时,i的值累加
if(i>=3&&score[k]=='T')//若累加到3,这个人为T时,进行操作
{
i=0;//i的值重新记为0
score[k]='F';//这个人被记为F,淘汰
sum--;//人的总数减一;
}
k++;//重新开始报数
if(k>a-1)//若k累加到数组人数之上时,代表一圈报数的结束
{
k=0;//数组重新从零开始
}
}
for(int i=0;i<a;i++)
{
if(score[i]=='T')//判断最后结果仍为T的人是最后一个人
{
printf("%d",i+1);//输出这个人的序号(注意:不是数组下标)
}
}
return 0;
}
可能源代码从dev-c++粘上去比较乱,了解思路即可。加油!
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复