【问题描述】
设计并实现一个解决约瑟夫环问题的类Joseph。当需要解决一个n个人间隔为m的约瑟夫环问题,可以构建一个对象Joseph obj(n, m),然后调用obj.simulate()输出模拟删除过程。
【输入形式】
输入为三个正整数n和m和k,空格分隔,分别代表编号长度和间隔长度和起始位置,编号长度n<=50。
【输出形式】
输出为n个整数,空格分隔。
【样例输入1】
10 4 1
【样例输出1】
4 8 2 7 3 10 9 1 6 5
【样例输入2】
30 10 5
【样例输出2】
14 24 4 15 26 7 19 1 13 28 11 27 12 30 18 6 25 20 10 8 5 9 17 23 16 3 22 29 21 2
【样例说明】
约瑟夫环的起始编号为1,编号为[1, n]。
注意判断数组是否溢出。
m的值可以大于n。
1<=k<=n
【示例代码如下】
cpp
#include <iostream>
#include<vector>
using namespace std;
class Joseph
{
public:
Joseph(int N,int M,int K=1):n(N),m(M),k(K){}//初始化
void simulate();
private:
int n;//编号长度
int m;//间隔长度
int k;//起始位置
};
void Joseph::simulate()
{
int *a=new int[50];//存储数的数组
int lef = n;//剩余标记的人数
int p = k-1;//指向起始位置
int i = 0;
int number = 0;
int *flag=new int [50];
//将两个数组初始化
for (; i<n; i++)
{
a[i] = i + 1;//编号
flag[i] = 1;
}
for (i=n; i<50; i++)
{
a[i] = 0;
flag[i] = 0;
}
while (lef >= 1)
{
number = m;//报号数
while (number>0)
{
if (flag[p] == 1)
{
number--;
p++;
}
else if (p >= n)
p = 0;
else
p++;
}
cout << a[p-1] << " ";
flag[p-1] = 0;
lef--;
}
}
//测试程序
int main()
{
int n,m,k;
cin >>n>>m>>k;
Joseph obj(n, m, k);
obj.simulate();
return 0;
}