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

版权声明:转载请声明原文链接地址,谢谢! https://blog.csdn.net/weixin_42859280/article/details/85303595

题目描述

有n人围成一圈,顺序排号。
从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。`在这里插入代码片`
问最后留下的是原来的第几号的那位。

输入

初始人数n

输出

最后一人的初始编号

样例输入

3

样例输出

2

来源/分类

C语言

题目截图:

在这里插入图片描述
思路:

这个代码使用比较简单的方式来解决的。
不使用数据结构里面的知识。
挺不错的思想!
quit_num=0;/*出圈人数*/
i=0;k=0;
while(quit_num<n-1)/*直到只剩下1人时*/
{
	if(a[i]!=0)//这个是判断已经出去过的人!
		k++;//来为K增加数据。
	if(k==3)//当满足题目中的数到第三个人的时候!进行下面的操作!
	{
		a[i]=0;//模拟这个人被踢出去的操作!
		quit_num++;//这个是判断结束条件的~
		k=0;//重置判断条件,就是从0再开始增加。到3的时候,开始剔除人。
	}
i++;//这个是人数的推进!
if(i==n)//这个挺重要的,这个到达最后的时候。代表第一圈循环结束啦。到达最后进行的操作!
	i=0;//没有这个语句的话。就无法进入下一次循环!
}

完整代码:

#include <iostream>
using namespace std;
int main()
{int a[100000]={0},i,quit_num,k;int n;
cin>>n;
for(i=0;i<n;i++)/*数组a存放原始编号*/
a[i]=i+1;
quit_num=0;/*出圈人数*/
i=0;k=0;
while(quit_num<n-1)/*直到只剩下1人时*/
{
	if(a[i]!=0)
		k++;
	if(k==3)
	{
		a[i]=0;
		quit_num++;
		k=0;
	}
i++;
if(i==n)
	i=0;
}
for(i=0;i<n;i++)
if(a[i]!=0)
	printf("%d",a[i]);
}

代码截图:
在这里插入图片描述
运行结果:
在这里插入图片描述
OJ结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42859280/article/details/85303595