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;
}
相关推荐
leobertlan6 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的6 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1237 小时前
答案daanC语言
数据结构·算法
死磕音视频7 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
Navigator_Z8 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
WL学习笔记9 小时前
C & C++ 内存管理
c++·c++内存管理
pride.li10 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
旺仔仔仔10 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法