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

【示例代码如下】

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;
}
相关推荐
学Linux的语莫18 分钟前
机器学习数据处理
java·算法·机器学习
csbysj202037 分钟前
如何使用 XML Schema
开发语言
R6bandito_42 分钟前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
逆小舟1 小时前
【C/C++】指针
c语言·c++·笔记·学习
earthzhang20211 小时前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
江公望1 小时前
Qt QtConcurrent使用入门浅解
c++·qt·qml
杨枝甘露小码1 小时前
Python学习之基础篇
开发语言·python
我是华为OD~HR~栗栗呀1 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
武文斌771 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
爱吃喵的鲤鱼1 小时前
仿mudou——Connection模块(连接管理)
linux·运维·服务器·开发语言·网络·c++