C语言-报数:
题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号;
样例输入 3
样例输出 2
分析题目:
此题要求最后输出的是开始时人的编号,那么我们在一开始就需要先提前为每个人记录编号。
报三退出圈子那么可以有个"形式循环变量",在循环进行报数中进行报三的记录,讲报过三的人重新赋值为0(类似于立FLAG)这样在最后输出是可以只挑出没有报三的那个人,且不改变编号。
那么大概就分为以下几步1.定义人数n,定义编号数组,定义初始循环变量i;2.剔除报过三的数据。3.输出最终的编号。
解答
#include<iostream>
using namespace std;
int main()
{
//定义编号
int n;
cin>>n;
int num[10000]
for(int i=0;i<n;i++)
{
num[i]=i+1;
} //为每个人添加编号
int cnt=0;
int d=1; //定义一个报三的形式循环变量
//剔除报三的人
while(cnt!=n-1) //确保最终没有报三的人只剩下1个人
{
for(int i=0;i<n;i++)
{
if(num[i]!=0) //顺序挑选未保过三的编号
{
if(d==3) //说明此人此次应报三
{
num[i]=0; //凡是报过3的重新被赋值为0
d=1; //重新开始报三
cnt++; //记录报三的人数
}
else d++; //没有报到三,依次往下报数
}
}
}
//输出最中留下的编号
for(int i=0;i<n;i++)
{
if(num[i]!=0)
cout<<a[j]<<endl;
}
return 0;
}
运行结果