【C】队列报数问题

本文探讨了一种数学逻辑问题,即在一个环形排列的人群中,通过从1到3报数的方式,找出最终剩余的人所在的初始位置。通过分情况讨论数组长度大于2和等于2的情形,本文提供了一个详细的解决算法,包括初始化数组、循环报数过程以及最终确定答案的方法。
摘要由CSDN通过智能技术生成

题目要求是这样的:有n个人围成一圈,顺序排好,从第1个人开始报数,从1到3报数,凡是报到3的人退出圈子,之后的报数的人从1开始重新报数,问此圈子最后剩下的是原来第几号的那个人。

此题必须分为两种情况考虑,就是报数的时候,队列中的人数大于2的情况与等于2的情况,当然队列人数为1的时候那个人就是答案了。之所以分两种情况来操作,是因为报数逢3一次循环,队列中的人数大于2,遍历数组的迭代器会可以继续向后移动,如果队列中的人数为2,迭代器到末尾则向需要向后折返从头开始。

因此代码如下:

#include<stdio.h>
void main(){
	int a[255];
	int n;
	printf("圈内人数:");
	scanf("%d",&n);
	//数组初始化
	int i;
	for(i=1;i<n+1;i++){
		a[i]=i;
	}
	a[i]=0;//对数组进行封口
	int count=1;//每个人所报的数,报数从1开始
	while((a[2]!=0)&&(a[3]!=0)){//队伍中剩下1个人或者2个人则停止这个算法		
		for(i=1;a[i]!=0;i++){
			if(count%3==0){
				//求解的过程,就是一个缩减队列的过程,也就是缩减数组a的过程。
				for(int j=i;a[j]!=0;j++){
					a[j]=a[j+1];//报数到3出队	
					count=1;//报数只能报1,2,3,1,2,3....报完3,重新从1开始计算
				}				
			}
			count++;//若不是报3,则报一下个数
		}
	}
	if(a[3]==0){//若数组仅剩2个数,则第2个数是答案,也就是说,若整个队列仅剩2个人,则第2个人是最后一个报数的人
		a[1]=a[2];
	}
	printf("最后一个报数的人:%d\n",a[1]);//若数组仅剩1个数,则此数位答案,也就是说,若整个队列仅剩1个人,则此人是最后一个报数的人

}

运行结果如下:


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值