丢手帕问题(约瑟夫问题-数组实现)

127 篇文章 0 订阅
102 篇文章 1 订阅

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。 
例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。

输入两个整数N,M 
比如 6 5 
输出被杀掉的人的序号 
比如5 4 6 2 3 1 
再比如: 
输入 11 3 
输出 3 6 9 1 5 10 4 11 8 2 7

分析:这里用数组实现约瑟夫问题。用数组从1开始,记录每个人是否存活,当计数器大于人数n时模n置1。每当遍历到活人时报数加一,当报数为m时杀人,报数置0。当仅剩一人时,报数到m则计数器指向此人。按照顺序输出即可。

代码:

#include<iostream>
#define MAX 1000
using namespace std;
int main()
{
	int people[MAX] = {0};
	int n, m;
	int num = 0;
	int dead = 0;
	cin >> n >> m;
	int i = 1;
	while(1)
		{
			if(i > n)
				i %= n;
			if(people[i] == 0)
				num++;
			if(dead != n - 1 && num == m)
				{
					num = 0;
					dead++;
					people[i] = 1;
					cout << i << ' ';
				}
			if(dead == n - 1 && num == m)
				{
					cout << i << endl;
					break;
				}
			i++;
		}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值