约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
输入两个整数N,M
比如 6 5
输出被杀掉的人的序号
比如5 4 6 2 3 1
再比如:
输入 11 3
输出 3 6 9 1 5 10 4 11 8 2 7
分析:这里用数组实现约瑟夫问题。用数组从1开始,记录每个人是否存活,当计数器大于人数n时模n置1。每当遍历到活人时报数加一,当报数为m时杀人,报数置0。当仅剩一人时,报数到m则计数器指向此人。按照顺序输出即可。
代码:
#include<iostream>
#define MAX 1000
using namespace std;
int main()
{
int people[MAX] = {0};
int n, m;
int num = 0;
int dead = 0;
cin >> n >> m;
int i = 1;
while(1)
{
if(i > n)
i %= n;
if(people[i] == 0)
num++;
if(dead != n - 1 && num == m)
{
num = 0;
dead++;
people[i] = 1;
cout << i << ' ';
}
if(dead == n - 1 && num == m)
{
cout << i << endl;
break;
}
i++;
}
return 0;
}