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;
}
相关推荐
报错小能手4 分钟前
ios开发方向——swift并发进阶核心 Task、Actor、await 详解
开发语言·学习·ios·swift
七夜zippoe4 分钟前
OpenClaw 飞书深度集成:多维表格
数据库·算法·飞书·集成·openclaw
共享家95275 分钟前
C++ 日志类设计
linux·c++·后端
小辉同志10 分钟前
208. 实现 Trie (前缀树)
开发语言·c++·leetcode·图论
A-刘晨阳11 分钟前
当数据学会“秒回“:工业4.0时代的实时计算革命
开发语言·数据库·perl
YaraMemo11 分钟前
移动通信中的线性预编码(发射端)和线性合并(接收端)算法
算法·5g·信息与通信·信号处理·预编码算法
py有趣12 分钟前
力扣热门100题之括号生成
算法·leetcode
沐知全栈开发12 分钟前
Lua 基本语法
开发语言
hanbr12 分钟前
每日一题day2(Leetcode 704二分查找)
数据结构·算法·leetcode
John.Lewis13 分钟前
C++加餐课-stack_queue:反向迭代器
数据结构·c++