约瑟夫问题仿真c++初学者
时间: 2023-11-08 10:05:09 浏览: 87
好的,约瑟夫问题是一个经典的数学问题,描述如下:有n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,直到剩下最后一个人。请问最后剩下的人在原来的位置是第几个人?
以下是一个简单的C++代码实现:
```c++
#include <iostream>
using namespace std;
int josephus(int n, int m) {
int ans = 0;
for (int i = 2; i <= n; i++) {
ans = (ans + m) % i;
}
return ans + 1;
}
int main() {
int n, m;
cin >> n >> m;
cout << josephus(n, m) << endl;
return 0;
}
```
相关问题
约瑟夫环绕问题c++
约瑟夫环绕问题是一个经典的数学问题,也被称为约瑟夫问题或约瑟夫斯置换。问题的描述如下:
有n个人围成一圈排队,从第一个人开始报数,数到 m 的人出列,然后从出列的下一个人开始重新报数,直到所有人都出列。要求找出出列的顺序。
解决这个问题的一种常见方法是使用递归。首先,定义一个递归函数,命名为josephus(n,m),表示n个人中按照m进行报数的出列顺序。递归函数的返回是一个列表,表示出列的顺序。
递归函数的基本情况是,当只有一个人时,该人是最后出列的,直接返回一个只包含该人的列表。
当有多个人时,我们需要找到第一个出列的人。根据问题的要求,第一个出列的人是从出列的下一个人开始重新报数。所以,我们可以递归调用josephus(n-1,m),表示去掉第一个人后剩下的n-1个人按照m进行报数的出列顺序。然后,将返回的列表中第一个人加入到结果列表中。
最后返回结果列表,表示n个人按照m进行报数的出列顺序。
下面是一个用Python实现的例子:
def josephus(n,m):
if n == 1:
return [1]
else:
remaining = josephus(n-1,m)
idx = (m-1) % len(remaining)
return remaining[:idx] + [n] + remaining[idx+1:]
n = 10
m = 3
result = josephus(n,m)
print(result)
使用上述代码,当有10个人时,按照每次报数3个人出列的规则,最后出列的顺序为[4, 1, 8, 6, 2, 10, 3, 7, 5, 9]。
约瑟夫环问题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;
}
```