【问题描述】
设计并实现一个解决约瑟夫环问题的类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
【示例代码如下】
- #include
- #include
- 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
- {
- 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;
- }