约瑟夫问题c++利用vector
时间: 2023-11-20 09:58:32 浏览: 87
以下是使用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++语言
约瑟夫问题,也称为环形链表问题,是一个经典的算法问题,通常描述为在一个循环排列的人群中,从第一个人开始报数,每次跳过一个人,报到特定数字(如3)的人出列,然后下一个人继续从头开始报数。当只剩下最后一个人时,那个人就是最终的答案。
在C++中解决约瑟夫问题,可以采用模拟的方法,创建一个数组或链表表示人群,并通过迭代计算每个人在游戏中的位置。关键在于找到满足条件的循环周期。下面是一个简单的C++示例:
```cpp
#include <iostream>
using namespace std;
int josephus(int n, int k) {
if (n == 1 || k == 1) return 0; // 如果人数或步长为1,直接返回0
// 创建一个环形队列,初始指针指向第一个节点
int person = 0;
vector<int> ring(n);
for (int i = 0; i < n; ++i) {
ring[(person + i) % n] = i + 1;
}
while (ring.size() > 1) { // 当只剩一人时跳出循环
person = (person + k - 1) % ring.size(); // 每次移动k-1位
ring.erase(ring.begin() + person); // 删除当前人
}
return ring[0]; // 返回最后一个存活的人
}
int main() {
int n, k;
cout << "请输入总人数和报数步长:";
cin >> n >> k;
cout << "最终存活的人编号为:" << josephus(n, k) << endl;
return 0;
}
```
在这个代码中,`josephus`函数接收两个人数`n`和步长`k`作为参数,计算并返回存活的人的编号。用户可以在主函数中输入这两个值来解决问题。
阅读全文