题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(模拟)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42172261/article/details/86078302

题目:
有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。

思路:
题目说是排成一圈,可以看成一个数组的排列。用i从下标为1的地方开始遍历这个数组(个人习惯从下标为1处开始),每当i==n+1的时候,就给他重新设置成1,这样就实现了n个人围成一圈的效果。 再就是数组的每个元素在一开始都设置成1,表示在圈中,如果要退出圈子,就给它设成0。

代码:

#include <stdio.h>
int main()
{
	int a[50], i, n, count, flag=0;
	scanf("%d", &n);
	count=n;
	for (i=1; i<=n; i++)
		a[i]=1;//所有人都在圈内,为1 
	for (i=1; ;i++){
		if (i==n+1)
			i=1;//如果i超出了n个人,让他重新回到1 
		
		if (a[i]!=0)	flag++;
		else	continue;
		
		if (flag%3==0){
			a[i]=0;
			count--;
		}
		
		if (count==1)//表示只剩下一个人在圈内 
			break;
	}
	for (i=1; i<=n; i++)
		if (a[i]!=0)
			printf("%d", i);//注意这里是输出i,一开始写的a[i],调试了老半天 
	return 0;
} 
展开阅读全文