用c++写一个约瑟夫快速递归的代码
时间: 2024-03-12 22:49:14 浏览: 29
下面是使用C++实现的约瑟夫快速递归算法代码:
```cpp
#include <iostream>
using namespace std;
int josephus(int n, int m) {
if (n == 1) {
return 1;
}
int x = josephus(n - 1, m);
int y = (x + m-1) % n;
return y + 1;
}
int main() {
int n, m;
cout << "请输入人数n和每次报数的数m:\n";
cin >> n >> m;
int result = josephus(n, m);
cout << "最后一个出圈的人的编号是:" << result << endl;
return 0;
}
```
输入人数n和每次报数的数m,程序会输出最后一个出圈的人的编号。
相关问题
约瑟夫环问题c++代码
约瑟夫环问题是一个经典的数学问题,描述了一群人围成一圈报数,每报到第m个人就出局,直到最后只剩下一个人。以下是两种解决约瑟夫环问题的C++代码示例:
方法一:使用数组实现约瑟夫环
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[110] = {0}; // 初始化,0代表未出局,1代表出局
int cnt = 0; // 记录出局人数
int i = 0, k = 0;
while (cnt != n) {
i++; // id代表每个人的编号
if (i > n) i = 1; // 发现i数了一圈了,从1重新开始数
if (a[i] == 0) {
k++; // k增到m就出局
if (k == m) {
a[i] = 1; // 出局
cnt++;
cout << i-1 << " ";
k = 0; // 清空k,重新开始数
}
}
}
return 0;
}
```
方法二:使用递归解法
```cpp
#include <bits/stdc++.h>
using namespace std;
int ysf(int n, int m, int i) {
if (i == 1) return (m-1 + n) % n;
else return (ysf(n-1, m, i-1) + m) % n;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cout << ysf(n, m, i) << " ";
}
return 0;
}
```
你可以用c++解决约瑟夫环吗,不允许使用递归算法
可以的,下面是使用C++实现的非递归算法:
```
#include<iostream>
#include<cstring>
using namespace std;
int n, m;
int josephus() {
int ans = 0;
for (int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
return ans + 1;
}
int main() {
while (cin >> n >> m) {
cout << josephus() << endl;
}
return 0;
}
```
在这个算法中,我们使用了一个循环来计算每一轮的幸存者。变量ans记录了上一轮的幸存者的编号,然后通过计算本轮幸存者在上一轮的编号,可以得到本轮幸存者的编号。最后加1是因为题目要求编号从1开始。