C++ 约瑟夫环(数组)

【问题描述】

设计并实现一个解决约瑟夫环问题的类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 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_74287172/article/details/134231998