基本思路:用一个数组代表一圈人,未退出圈子的数值为0,退出圈子的数值为1。
首先从第一位开始数,数到第三位,第三位退出,数组a[j]的值变为1。然后从下一位开始数,当数到第n+1人的时候,利用取余,n+1人取余后即第一个人((n+1)%n=1)。
并且每当推出一个人,人数减1,当人数只剩下一个的时候退出循环,输出那个人是第几号。
代码如下:
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int x=n;//x用于取余重置
int a[n]={0};//代表一圈人 未退出圈子的为0,退出圈子标记为1
int j=0;
while(n!=1)
{
for(int i=0;i<3;i++)
{
if(a[j]==1)//代表该人已经退出
i--;
else if(i==2)//代表已经数到第三个了
{
a[j]=1;
n--;
if(n==1)//还剩下最后一个
break;
}
j++;
j=j%x;
}
}
for(int i=0;i<x;i++)//查找最后一个人
if(a[i]==0)
cout<<i+1;
}