约瑟夫问题
数组模拟实现
- 题目
约瑟夫 (Josephus) 问题:n 个人围坐成一圈,从 1 开始顺序编号;游戏开始,
从第一个人开始由 1 到 m 循环报数,报到 m 的人退出圈外,问最后留下的那
个人原来的序号。
- 代码
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int m, n;
while (cin >> n >> m)
{
if (!m || !n)
continue;
bool human[10010] = { 0 };
int turn = 0;
for (int i = 0; i < n; i++)
{
if (i == n - 1) // 如果只剩一个人
for (int k = 1; k <= n; k++) // 输出还没有出局的位置
if (human[k] == false)
{
cout << k << endl;
break;
}
for (int j = 0; j < m; j++)
{
turn++; // 轮流报数
if (turn > n) // 如果一圈结束则从第一个人继续报数
turn = 1;
if (human[turn]) // 如果第turn位出局,则下一位继续报数
j--;
}
human[turn] = true; // 一次报数结束,最后一个报数的第turn位出局
}
}
return 0;
}
仅个人学习留存,侵私删。