用c++写一个约瑟夫快速递归的代码
时间: 2024-03-12 08:49:14 浏览: 71
下面是使用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++代码递归
约瑟夫环(Josephus Problem),也被称为隔数删除问题,是一个经典问题,通常涉及在一个圈子里的人按照特定间隔轮流被剔除。在C++中,可以使用递归来解决这个问题。下面是一个简单的递归函数实现:
```cpp
#include <iostream>
int josephus(int n, int k) {
if (n == 1) { // 如果只剩一个人,直接返回0,表示不用剔除
return 0;
}
return (josephus(n - 1, k) + 1) % n; // 递归调用,k作为跳过的人数,每次增加1并取模n保持在圈子内
}
int main() {
int people, skip;
std::cout << "请输入人数(大于1): ";
std::cin >> people;
std::cout << "请输入跳过的人数: ";
std::cin >> skip;
if (skip > people) {
std::cerr << "跳过人数不能超过总人数!" << std::endl;
return -1; // 跳过人数错误处理
}
int position = josephus(people, skip);
std::cout << "第" << position+1 << "个人将被剔除。\n";
return 0;
}
```
在这个代码中,`n`代表圈子中的人数,`k`代表需要跳过的人数。当n等于1时,游戏结束,最后剩下的人就是结果。函数`josephus`通过递归计算出最终位置。
你可以用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开始。
阅读全文