【C】队列报数问题

题目要求是这样的:有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个人,则此人是最后一个报数的人

}

运行结果如下:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 02:49:28

【C】队列报数问题的相关文章

ACM学习历程—HDU 1276 士兵队列训练问题(队列)

Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠 拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报 数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数,每行输出

天体物理学-星际穿越

转载自:?http://www.cnblogs.com/yangpf/p/4148488.html 确实非常喜欢这样的文章,简单的说明白了很多有意思的科学史.天体物理学啊天体物理学.. 以下是原文 本文献给所有爱思考,爱阅读的人 前言 最近去影院看了<星际穿越>,很棒.有种说法是:全体观众都看跪了,一部分是因为影片太棒了,跪了.一部分则是完全没看明白,跪了.影片中出现了牛顿定律,相对论,虫洞,黑洞等概念,而且对这些概念的解释也是点到为止,有些概念甚至没有做任何说明,这样对不爱理科的文科生来说确

【算法】 最近面试遇到的一道报数出队列的题

题目 : 有n(正整数)个数排成一列,一个挨一个报数,当报的数能被x(x>0)整除时,移除该数,直到数列中只有一个数,求该数的一开始的位置 解答 public static int Demo(int n, int x) { if (n <= 0) { throw new Exception("n为正整数,请输入正确的数字"); } if (x <= 0) { throw new Exception("x必须大于0,请输入正确的数字"); } var

约瑟夫环问题(循环队列)

1 ////////////////////////////////////////////////////////////////////////////// 2 // SqQueue.cpp 3 // 4 // author:Leetao 5 ////////////////////////////////////////////////////////////////////////////// 6 // 简介: 7 // 约瑟夫环问题:设有编号为1,2,……,n的n(n>0)个人围成一个

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

【C】n个人排成一圈报数的问题

问题来自:<C程序设计>(第四版)谭浩强 清华大学出版社 第291页 有n个人围城一圈,顺序排号.从第一个人开始报数(从1报到m),凡是报到m的人退出圈子,接着从循环队列的下一位开始报数(该数为1).问最后留下的是原来几号的那位. 注:本例为模拟题,按要求写程序即可. 示例代码: 1 #include <stdio.h> 2 3 int a[100]; 4 5 int find(int *a, int n, int m) 6 { 7 int counter = n; 8 int i

C++面试笔记--循环链表,队列,栈,堆

之前已经学会了单链表的建立删除插入转置以及一些普通操作,双链表和单链表差不多,就是多了一个前驱指针,在许多操作中很方便,但是加了一个指针开销应该会大一些,总体上影响不大,这里开始讨论循环链表以及其他的一些数据结构. 1.已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从k开始报数,数到m的那个人出列,依次重复下去,直到圆桌的人全部出列.试用C++编写实现. 解析:本题就是约瑟夫环问题的实际场景,要通过输入n.m.k三

栈、队列、单链表

栈: <span style="color:#000000;">#define MAX_SIZE 100//队列的最大长度 //-------------------------栈----------------------- int top=0;//栈顶变量 void add(char st[],char intput){ //入栈函数 st[top]=intput; top++; } void pop(char st[]){ //出栈函数 top--; st[top]=

hdu 1276士兵队列问题【queue】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 士兵队列训练问题                                               Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)