0
点赞
收藏
分享

微信扫一扫

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


题目描述

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

输入

初始人数n

输出

最后一人的初始编号

样例输入

3

样例输出

2

来源/分类

C语言

题目截图:

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


思路:

这个代码使用比较简单的方式来解决的。
不使用数据结构里面的知识。
挺不错的思想!
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]);
}

代码截图:

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


运行结果:

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


OJ结果:

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


举报

相关推荐

0 条评论