C++[算法]用数组模拟约瑟夫问题,即 N个人围成一圈,顺时针每数到给定K值的人出列,直到剩下最后一个人,求出圈人的序号顺序

本文介绍了如何使用C++编程解决约瑟夫问题,即N个人围成一圈,按照顺时针方向每数到K值的人出列,直到剩下最后一个人。通过数组来存储人员编号,程序会输出淘汰出圈的人员顺序。
摘要由CSDN通过智能技术生成

约瑟夫是公元1世纪一位著名的历史学家。

约瑟夫问题可简述为:

有n人围坐成一圈(假设他们的编号沿顺时针方向依次为1到n)。编程序,使用数组来存放各数据(人员编号),而后从1号人员开始数起(沿顺时针方向),当数到k时(其中k>1由用户通过cin输入指定),则该号人员被“淘汰出局”;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从1开始数起,数到k后,淘汰第2个人;如此继续,直到最后剩下一个人时停止。请输出先后被“淘汰”的人的编号。 

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
	unsigned int uiMenCount;//圈中总人数
	unsigned int uiK;//指定的K值
	unsigned int uiNextQuitIndex=0;//下一次要出列的人的索引
	int *pIntArr=NULL;
	while(true)
	{
		cout << "Enter the number of people: ";
		cin >> uiMenCount;
		pIntArr=new int[uiMenCount];

		for(unsigned i=0;i<uiMenCount;i++)
		{
			pIntArr[i]=0;
		}

		cout << "Enter the number Who will breaks the ranks: ";
		cin >> uiK;

		/*uiMenCount个人,全部出列后只剩下一个人,所以只需uiMenCount-1次循环*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值