[保研/考研机试] 约瑟夫问题No.2 C++实现

题目要求:

输入、输出样例:

源代码:

cpp 复制代码
#include<iostream>
#include<queue>
#include<vector>
using namespace std;

//例题5.2 约瑟夫问题No.2
int main()
{
	int n, p, m;
	while (cin >> n >> p >> m) {
		//如果输入的是3个0,直接结束循环
		if (n == 0 && p == 0 && m == 0) {
			break;
		}
		//定义一个队列,用于存放n个小孩的编号
		queue<int> myQueue;
		//由于是从编号为p的小孩开始,直接按照 p,p+1,...n,1,2,...,p-1的顺序存入队列中
		for (int i = p; i <= n; i++) { // 存储p,p+1,...n的编号
			myQueue.push(i);
		}
		for (int i = 1; i < p; i++) { // 存储1,2,...,p-1的编号
			myQueue.push(i);
		}

		//定义一个vector,由于vector不会自动阿皮序,可以用于保存永久出队的元素的先后顺序,就是小孩从圈中出队的顺序
		vector<int> nums;
		//开始循环,只要队列不为空,说明小孩还没有全部出队,那就继续遍历
		while (!myQueue.empty()) {
			//由于报数是从1开始的,这里的i初始化为1,便于后续判断是否为4的整数倍
			//for循环的结束条件为nums中元素个数为小孩的总个数,说明此时小孩已经全部出队
			for (int i = 1; nums.size() < n; i++) {
				//当i为m的整数倍时,说明此时队头数字代表的小孩报数为m,直接出队,并且保存该数字到nums中
				//注意,要先保存到nums中,再出队
				if (i % m == 0) {
					nums.push_back(myQueue.front());
					myQueue.pop();
				}
				//当i不为m的整数倍时,说明此时队头数字代表的小孩报数不是m,直接放入队尾,出队,让下一个元素于队头
				else {
					myQueue.push(myQueue.front());
					myQueue.pop();
				}
			}
		}
		//由于输出用英文逗号隔开,且最后一个元素后面不需要逗号,那就先输出出最后的一个元素和逗号,再输出最后的元素
		for (int i = 0; i < nums.size()-1; i++) {
			cout << nums[i] << ",";
		}
		cout << nums[nums.size() - 1] << endl;
	}
	
	return 0;
}

运行结果:

相关推荐
图码3 分钟前
生命游戏的优雅解法:从O(mn)空间到O(1)空间的进阶之旅
数据结构·算法·游戏·矩阵·空间计算
蜡笔小马12 分钟前
09.C++设计模式-外观模式
c++·设计模式·外观模式
2301_8008951014 分钟前
蓝桥杯第十二届b组国赛真题--备战国赛版h
算法·蓝桥杯
晚会者荣17 分钟前
C++11_3:包装器,智能指针
c++
手写码匠19 分钟前
手写 AI Prompt Injection 防护系统:从零实现 LLM 安全边界
人工智能·深度学习·算法·aigc
薇茗20 分钟前
【初阶数据结构】 升沉有序的平仄 排序
c语言·数据结构·算法·排序算法
handler0121 分钟前
TCP(传输控制协议)核心机制与底层原理
linux·网络·c++·笔记·网络协议·tcp/ip·操作系统
王老师青少年编程21 分钟前
csp信奥赛C++高频考点专项训练之字符串 --【字符串综合】:遍历问题
c++·字符串·csp·高频考点·信奥赛
yoyo_zzm24 分钟前
五大编程语言对比:PHP、C、C++、C#、易语言
c语言·c++·php
杰之行27 分钟前
Fast-DDS Transport 层架构详解
c++·人工智能