约瑟夫环
问题描述
约瑟夫问题是个著名的问题: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为最后存活的人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】