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;
}
相关推荐
格林威42 分钟前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
小大宇1 小时前
Python 集成 Conda
开发语言·python·conda
ShineWinsu1 小时前
对于Linux:模版方法类的解析以及socket、TcpSocket的封装
linux·c++·面试·socket·模板方法模式·封装·tcpsocket
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
稚南城才子,乌衣巷风流2 小时前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm2 小时前
9 找到字符串中所有字母异位词
c++·算法·leetcode
小大宇2 小时前
python flask框架 SSE流式返回、跨域、报错
开发语言·python·flask
Legendary_0083 小时前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
Sw1zzle3 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木3 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先