解题思路:  用数组保存最开始位置。如果出圈,则赋值为0。反复计数,一直到出圈人数到n-1即可。

最后看看谁不是0,就是最后留下的。

注意事项:从a[1]开始保存位置。a[0]保存第n个位置,可以让循环更好进行。

参考代码:

#include <stdio.h>
#define N 100
int main()
{
	int a[N]={0};
	int i,n,k=0,m=0;
	scanf("%d",&n);
	a[0]=n;    //数组第0个存放第n位置,从第1个开始数 
	for(i=1;i<n;i++) 
		a[i]=i;  //存放位置,a[1]就是存放1,a[2]存放2等等 
	for(i=1;m<n-1;i++) //做n-1次即可,m统计出圈次数 
	{
		if(a[i%n]==0) //等于0,表示已经出圈 
			continue;
		k++;
		if(k==3)  //计数到3,则对应的出圈 
		{
			a[i%n]=0;  //出圈 
			m++;       //出圈加1 
			k=0;  
		}
	}
	for(i=0;i<n;i++)  //看看最后留下的是原来的第几号 
	{
		if(a[i]!=0)
			printf("%d",a[i]);
	}
	return 0;
}


点赞(1)
 

0.0分

63 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 16 条评论

月儿会弯 3年前 回复TA
@假行僧 i%n==i 1%3==1 精髓在于4%3==1一旦i超过n依然会从起点继续出发
Cx330 3年前 回复TA
这个逻辑是真厉害
4年前 回复TA
厉害
木头 4年前 回复TA
@假行僧 他的i会一直增加,超过n数组长度,需要用求模的方式,让指针回到数组0的位置
病猫 4年前 回复TA
@假行僧 问一下,那个a[i%n]中i%n什么意思
假行僧 5年前 回复TA
你好,请问i为什么从1开始?还有为什么a[i%n]?