题目描述
有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结果: