题目(5)答案

其实很简单,只要把淘汰的人跳过,把最后一个人链接到第一个人,围一个圈,就可以,所以我们是用队列解决。
代码:

#include <iostream>
#include <cstdio>
#include <windows.h> 

using namespace std;

bool visit[10000000] = {0};//visit赋初始值

int main()
{
	while(true){
    int n, s = 0;
	scanf("%d", &n);
    for(int k = 0; k < n; k++)
    {//总共要出队n次
        for(int i = 0; i < 3; i++)
		{
			//1,0000,0000
			if(++s > n)
				s = 1;
			if(visit[s])
				i--;
		}//类似取模,而因为序列是从1开始的,所以不取模,加判断;若visit过,则i--,使其继续循环
        visit[s] = true;//输出,记录已出队
    }
    printf("%d
", s);
    system("pause");
    system("cls");
	}
    return 0;
}
原文地址:https://www.cnblogs.com/coding365/p/12872429.html