设计并实现一个解决约瑟夫环问题的类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 <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 m, n,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; 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 m, n, k; cin >> n >> m >> k; Joseph obj(n, m, k); obj.simulate(); return 0; }