首页 > 其他分享 >幸运儿(C语言)

幸运儿(C语言)

时间:2024-03-22 18:33:49浏览次数:22  
标签:12 int 一圈 C语言 选出 幸运儿 模拟

前期做了1篇循环数循环数(模拟(C语言))-CSDN博客的题解,虽然看的人不是很多,但觉得能帮到一部分编程初学者和爱好者也非常不错

本次做的这篇文章也是一道模拟题(难易区别不好说,感觉因人而异)

问题描述

n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)

输入

有多个测试序列。每行是开始时的人数n

输出

第1 行是选出顺序,位置编号之间用一个空格分开,包括末尾空格。
第2 行是两名幸运儿的开始位置(按升序排列)。

样例输入

12
20
45

样例输出

2 4 6 8 10 12 3 7 11 5 
1 9
2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9 
1 17
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 3 7 11 15 19 23 27 31 35 39 43 5 13 21 29 37 45 9 25 41 17 
1 33

问题分析

主要要思考的就是人是否已经被选出,判断何时把人选出,怎样一圈结束一圈又起,什么时候结束,如何用程序语言来模拟这个过程

问题解决

1.人是否还在圈里

理所当然的可以想到用数组来模拟这个过程

int a[65];
for(i=1; i<=n; i++) {
	a[i]=0;
}

要注意初始化,数组开大一点没关系

后期便可用数组a[]的值来模拟人是否还在圈里

这里推荐洛谷上的一道题,或许可以加深映像

P1047 [NOIP2005 普及组] 校门外的树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

2.何时把人选出

根据题目要求,按顺时针方向每隔一人选出一个,即可用一个变量来存储隔了几个人了

int flag=0;
for(i=1; i<=n; i++) {
	if(a[i]==0)
	flag++;          
	if(flag==2) {
		a[i]=1;     
		flag=0;
		index_n--;
		printf("%d ",i);
	}
}

以flag的值进行判断并做出相应处理

3.结束标志

如此循环直到剩下两人,这剩下的两人就是幸运儿。

由此可定义一个变量保存相应人数,这里用的是

index_n=n;

再用上while循环即可

while(index_n>2) {
	...
	for(i=1; i<=n; i++) {
    ...
	}//一圈结束,又重新开始
}

用这个也正好模拟了剩下的人重新围成一圈,然后又重新选人,最终达到题目要求

4.最后输出

每一圈选人,想想可知道1是必然不会被选出的

从后面开始找

找到a[i]==0的输出就行了

完整代码

#include<stdio.h>

int main() {
	int n;
	while(scanf("%d",&n)!=EOF) {
		int i;
		int a[65];
		for(i=1; i<=n; i++) {     //初始化
			a[i]=0;
		}
		int index_n=n;
		while(index_n>2) {
			int flag=0;
			for(i=1; i<=n; i++) {  //模拟选人
				if(a[i]==0)
					flag++;
				if(flag==2) {
					a[i]=1;
					flag=0;
					index_n--;     //还剩多少人
					printf("%d ",i);
				}
			}
		}
		printf("\n");
		printf("1 ");           //1是必须的
		for(i=2;i<=n;i++){
			if(a[i]==0)
			printf("%d\n",i);
		}
	}
    return 0;
}

留给读者的话

做模拟题主要是要读懂题意,然后把问题的步骤分析清楚,自然就能迎刃而解了

标签:12,int,一圈,C语言,选出,幸运儿,模拟
From: https://blog.csdn.net/2301_79695613/article/details/136947327

相关文章

  • 深入了解C语言中浮点数的存储方式
    因为这期可能对你们来说太简单了,所以我用一个字来概括吧好了,结束了,我们下期再见喽,不会有人真的走了吧,好了,砸门多的不说少的不闹好吧,直接上主食。1.浮点数和整数在内存中存储的区别浮点数和整数在内存中存储的区别主要体现在数据表示和存储方式上:1.数据类型:  -整数(in......
  • #include<初见C语言之指针(3)>
    目录一、字符指针变量二、数组指针变量1.什么是数组指针变量?2.数组指针怎么初始化?三、二组数组传参的本质四、函数指针变量1.什么是函数指针变量?2.函数指针变量使用  3.有趣代码 3.1typedef关键字五、函数指针数组六、转移表总结一、字符指针变量字符指针......
  • C语言中,四则运算导致数据类型的转换
    在C语言中,四则运算可能导致数据类型的转换,这种转换称为隐式类型转换。以下是一些常见的数据类型转换情况:1.整数提升:当不同大小的整数类型(如`char`、`short`、`int`、`long`)进行混合运算时,较小的操作数会被提升为较大的类型,以便进行运算。例如,`char`类型的操作数会被提升为`......
  • C语言-教案04(从小白到劝退之运算符)
    算术运算符运算符功能说明举例+加法,一目取正a+b-减法,一目取负a-b*乘法a*b/除法a/b%取模(求余)a%b++自加1a++,++b--自减1a--,--b关注点:减号也是负号,比如-a是取变量a的相反数。取模运算要求左右两边操作数必须是整型数据......
  • 《C语言深度剖析》---------关键字(1)
    1.双击实质--->加载内存windows系统里面,双击的本质就是运行程序,把程序加载到内存里面;任何程序运行的时候都必须加载到内存里面;程序没有运行之前在硬盘里面,为什么程序运行之前必须加载到内存里面呢?这个时候就有必要了解一下冯诺依曼体系结构:我们输入的数据要到内存里面,经......
  • C语言内存函数之 memcpy和memmove函数
    memcpy函数的记忆方法:mem表示内存类函数,属于头文件string.h里面的函数。cpy是copy的缩写,表示对内存数据进行拷贝。memcpy函数的输入值和返回值:void* my_memcpy(void*brr,void*arr,size_tv) memcpy的输入值分别是被拷贝数据的brr的无类型数组的首地址,然后是拷贝给别人的无......
  • 【C语言】格式化输入/输出
    C语言格式化输入、输出简介使用printf函数格式化输出整数转换说明符浮点数转换说明符字符串转换说明符其他转换说明符字段宽度和精度控制标志转义符使用scanf函数格式化输入扫描设置(scanset)scanf函数的问题简介Streamsprovidecommunication......
  • 【C语言】文件读写
    Files&Streams访问文件顺序访问文件随机访问文件创建随机访问文件修改随机访问文件读取随机访问文件访问文件Programsmayprocessnofiles,onefileorseveralfiles.Eachfileusedinaprogrammusthaveauniquenameandwillhaveadiffe......
  • C语言解决水仙花问题
    题目叙述:水仙花数是 指一个三位数,它的每个位上的数字的3次幂之和等于它本身。(例如:153=13+53+35153=13+53+35)找到所有的水仙花数并按行打印,按从小到大的顺序输出。思路:首先确定范围,三位数(100--999),其次确定百位、十位、个位要怎么表示,令一个位数为i百位(a)a=i/100  ......
  • C语言解决切面条问题
    题目叙述:一根高筋拉面,中间切一刀,可以得到2根面条。如果先对折1次,中间切一刀,可以得到3根面条。如果连续对折2次,中间切一刀,可以得到5根面条。那么,连续对折10次,中间切一刀,会得到多少面条呢?分析:可以拿一张纸撕1条,对折3次从中间撕开是9块1次------3---2次------5---3次----......