算法训练 筛选号码 (约瑟夫环问题)

问题描述   有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。

  问最后留下的是原来第几号的那位。

  举个例子,8个人围成一圈:

  1 2 3 4 5 6 7 8

  第1次报数之后,3退出,剩下:

  1 2 4 5 6 7 8 (现在从4开始报数)

  第2次报数之后,6退出,剩下:

  1 2 4 5 7 8 (现在从7开始报数)

  第3次报数之后,1退出,剩下:

  2 4 5 7 8 (现在从2开始报数)

  第4次报数之后,5退出,剩下:

  2 4 7 8 (现在从7开始报数)

  第5次报数之后,2退出,剩下:

  4 7 8 (现在从4开始报数)

  第6次报数之后,8退出,剩下:

  4 7 (现在从4开始报数)

  最后一次报数之后,4退出,剩下:

  7.

  所以,最后留下来的人编号是7。 输入格式   一个正整数n,(1<n<10000) 输出格式   一个正整数,最后留下来的那个人的编号。 样例输入 8 样例输出 7 数据规模和约定   对于100%的数据,1<n<10000。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int i,j,k=0,a[1002],n, tuichu = 0;
	cin>>n;
	for (i=1; i<=n; i++)
	{
		a[i] = i;
	}
	i=0;
	while (tuichu < n-1)//还剩一个人退出循环
	{
		i==n ? i=1 : ++i; //n个人范围内
		if (a[i] != 0)
		{
			++k;
			if (k == 3)//将报到3的设为0
			{
				a[i] = 0;
				k = 0;
				tuichu++; //退出的人+1
			}
		}
	}
	for (i=1; i<=n; i++)
	{
		if (a[i] != 0)
		{
			cout<<a[i];
			break;
		}
	}
	return 0;
}
    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/qq_36238595/article/details/60572966
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞