用C++面向对象的思想完成约瑟夫问题,给出全部代码,创建的类需存放在头文件中
时间: 2024-03-09 22:51:23 浏览: 27
好的,以下是满足您需求的C++代码,类存放在头文件中:
```cpp
#ifndef JOSEPHUS_H
#define JOSEPHUS_H
#include <iostream>
using namespace std;
class Josephus {
private:
int n; // 总人数
int m; // 报数为m的人出圈
int *a; // 存储每个人的编号
public:
Josephus(int num, int count); // 构造函数
~Josephus(); // 析构函数
void play(); // 开始游戏
};
Josephus::Josephus(int num, int count) {
n = num;
m = count;
a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i + 1;
}
}
Josephus::~Josephus() {
delete[] a;
}
void Josephus::play() {
int i = 0, j = 0, k = 0;
while (k < n) {
if (a[i] != 0) {
j++;
}
if (j == m) {
j = 0;
cout << a[i] << " ";
a[i] = 0;
k++;
}
i++;
if (i == n) {
i = 0;
}
}
}
#endif
```
在上面的代码中,我们定义了一个 Josephus 类,并在其中定义了三个私有变量:n 表示总人数,m 表示报数为m的人出圈,a 是一个指针,用于存储每个人的编号。Josephus 类还有一个构造函数和一个析构函数,以及一个 play() 函数,用于开始游戏。在 play() 函数中,我们使用了一个 while 循环,循环内部的判断条件是当圈内人数 k 小于总人数 n 时,继续游戏。在每次循环中,我们使用 i、j、k 三个变量来记录当前位置的人的信息,同时根据题目要求报数出圈,输出当前出圈的人的编号,并将其从 a 数组中删除。最后,我们将 k++,i++,并判断 i 是否等于 n,如是,则将 i 置为 0,重新开始循环。