约瑟夫问题c++利用vector
时间: 2023-11-20 12:58:32 浏览: 38
以下是使用vector解决约瑟夫问题的C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;
int n = 0, i = 0, k = 0, m = 0, p = 0;
cin >> n >> k >> m;
for (i = 0; i < n; i++) {
// 初始化
a.push_back(i + 1);
}
p = k - 2; // 从第n个人开始数,第零位其实是n前面的那个人。数组表示法,还要减一
while (a.size() > 1) { // 循环剔除,直到只剩一个
for (i = 0; i < m; i++) {
if (p + 1 >= a.size()) { // 如果已经到了最后一个数
p = 0;
} else {
p++;
}
}
a.erase(a.begin() + p);
p--; // 重新指向前一个数,再循环m次
}
cout << a[0];
}
```
相关问题
约瑟夫问题c++ 用vector做
以下是使用vector解决约瑟夫问题的C++代码示例:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cout << "请输入总人数n和报数m:";
cin >> n >> m;
vector<int> v(n);
for (int i = 0; i < n; i++) {
v[i] = i + 1;
}
int index = 0;
while (v.size() > 1) {
index = (index + m - 1) % v.size();
cout << v[index] << " ";
v.erase(v.begin() + index);
}
cout << endl << "最后留下的人是:" << v[0] << endl;
return 0;
}
```
约瑟夫问题c++代码数组
约瑟夫问题是一个经典的数学问题,描述如下:有n个人围成一圈,从第k个人开始报数,报到m的人出列,然后从下一个人开始重新报数,直到所有人都出列。现在给定n、k和m的值,请编写C++代码实现约瑟夫问题。
以下是一种可能的实现方式:
```cpp
#include <iostream>
#include <vector>
int josephus(int n, int k, int m) {
std::vector<int> people(n);
for (int i = 0; i < n; i++) {
people[i] = i + 1;
}
int index = k - 1;
while (people.size() > 1) {
index = (index + m - 1) % people.size();
people.erase(people.begin() + index);
}
return people[0];
}
int main() {
int n, k, m;
std::cout << "请输入总人数n:";
std::cin >> n;
std::cout << "请输入起始位置k:";
std::cin >> k;
std::cout << "请输入报数间隔m:";
std::cin >> m;
int winner = josephus(n, k, m);
std::cout << "最后剩下的人是:" << winner << std::endl;
return 0;
}
```
这段代码中,我们使用了一个vector来表示所有的人,并按顺序给每个人编号。然后,我们从起始位置开始,每次报数到m的人出列,直到只剩下一个人为止。最后,输出剩下的那个人的编号。