<pre name="code" class="plain">Description
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
Input
初始人数n
Output
最后一人的初始编号
Sample Input
3
Sample Output
2
</pre>代码如下<pre>
#include <iostream>
using namespace std;
int main()
{
int a[101];
int i,n,m=0,k=0;
cin>>n;
for(i=0; i<n; i++)
a[i]=i+1;
i=0;
while(m<n-1)
{
if(a[i]!=0)
k++;
if(k==3)
{
a[i]=0;
k=0;
m++;
}
i++;
if(i==n)//i的到最后归零重新赋值1 2 3报数
i=0;
}
for(i=0;i<n;i++)
if(a[i]!=0)
cout<<i+1;
return 0;
}
学习心得:
又有几天没有刷题,赋初值各种忘记,最大的难题是解决每个人所代表的1,2,3都在每次循环中变化,即i到最后时归零,然后i又从新的一轮变化中,i++,不断找出新的报数为三的人。其中用另一个变量k来代替i在1,2,3中不断变化。k在每次等于三时归零,继续1,2,3循环,此时i人对应值也变为零,便于最后找出剩下的人。