约瑟夫环

问题描述

约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。

解决方式

1.数组模拟
2.递归处理
3.公式法

模拟

#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N];

int main() {
	cin >> n >> m;//总共多少人,数到多少退出
	int cnt = 0, i = 0, k = 0;//退出的人数,计数到第几个,报数。
	while (cnt != n) {
		i ++;
		if (i > n)
			i = 1;
		if (a[i] == 0) {
			k ++;
			if (k == m) {
				a[i] = 1;
				cnt ++;
				cout << i << ' ';
				k = 0;
			}
		}
	}
	return 0;
}

递归

#include <iostream>
using namespace std;

int ysf(int n, int k, int i) {//n个人的环,数到k的人退出,第i个人退出的编号
	if (i == 1)
		return (n + k - 1) % n;
	else
		return (ysf(n - 1, k, i - 1) + k) % n;
}

int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i ++ )
		cout << ysf(n, m, i) + 1 << ' ';//每次退出的人编号顺序输出
	return 0;
}

公式法
x = a + m^n
y = ma + 1
x为总人数,m为数到第几就出局的数,y为最后存活的人

posted @   帝宝单推人!  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示