解题思路:这个题目花了我好长时间,因为还不会链表。
1,这个题目是要有n个人,所以就是说会出局n-1个人,因此每出局一个人便会计数一次。
2,又由于是转成圈圈,考虑让循环一直循环,并且有一个计数可以随着循环一直累加下去,直至达到终止条件。
3,又由于需要的剩下人的序号,所以考虑一个自然数数组,并且让计数为3的倍数时让那个数变为0,且当再一次扫描那个数时,不作任何处理。
4,欲更加了解,请看代码。
注意事项:
参考代码:
#include<stdio.h>
int main(){
int n,i,m; //n为总的人数,i是为了循环用,m是为了让总循环停止而设置的一个数
int l=0; //l是总的计数
int t=0; //t是为了要记所需要的序号
int *p; //这一部分是给n以及数组赋值
scanf("%d",&n);
int a[n];
m=n;
p=&a[0];
for(i=0;i<n;i++)
*(p+i)=i+1;
while(m){ //循环的终止条件为当所有数组的数都变为0时
for(i=0;i<n;i++){
if(a[i]!=0){ //当那个人还没有出局的时候,就可以报数,其实也可以理解成,当那个人 //报数为3的倍数时,就会出局。
t=a[i]; //存在的人的序号就会被赋值给t,一直到最后一个,最后一个被赋值的即 //为胜利者
l++;
if(l%3==0){ //这是筛选出被淘汰的人的序号,并被赋值为0,以后不会再参加有效的 //循环
a[i]=0;
m--; //每淘汰一人,计数就减一,直至为0
}
}
}
}
printf("%d",t);//输出的为最后一个变为0的那个数组的元素值,即为胜利者。
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复