写一个约瑟夫环代码,用C++语言
时间: 2023-03-24 18:03:46 浏览: 111
好的,以下是一个约瑟夫环的 C 语言代码:
#include <stdio.h>
int josephus(int n, int k) {
if (n == 1) {
return 1;
} else {
return (josephus(n - 1, k) + k - 1) % n + 1;
}
}
int main() {
int n, k;
printf("请输入总人数n和出圈数字k:\n");
scanf("%d %d", &n, &k);
printf("最后留下的人的编号是:%d\n", josephus(n, k));
return ;
}
这个代码实现了一个约瑟夫环,输入总人数和出圈数字,输出最后留下的人的编号。
相关问题
用c++设计一个类解决约瑟夫环
约瑟夫环是一个经典的问题,可以通过链表或数组来实现。以下是使用 C 语言设计的类来解决约瑟夫环的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 定义约瑟夫环类
typedef struct Josephus {
int size; // 环的大小
Node *head; // 头指针
Node *tail; // 尾指针
// 添加节点
void add(int data) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (this->head == NULL) {
this->head = node;
this->tail = node;
} else {
this->tail->next = node;
this->tail = node;
}
this->size++;
}
// 删除节点
void remove(Node *prev, Node *curr) {
if (prev == NULL) {
this->head = curr->next;
} else {
prev->next = curr->next;
}
if (curr == this->tail) {
this->tail = prev;
}
free(curr);
this->size--;
}
// 解决约瑟夫环问题
void solve(int k) {
Node *prev = NULL;
Node *curr = this->head;
int count = 0;
while (this->size > 1) {
count++;
if (count == k) {
this->remove(prev, curr);
count = 0;
} else {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
curr = this->head;
}
}
printf("The last remaining person is %d.\n", this->head->data);
}
} Josephus;
int main() {
Josephus josephus = {0, NULL, NULL};
int n, k, i;
printf("Please enter the number of people in the circle: ");
scanf("%d", &n);
printf("Please enter the number of people to be eliminated each time: ");
scanf("%d", &k);
for (i = 1; i <= n; i++) {
josephus.add(i);
}
josephus.solve(k);
return 0;
}
```
在上面的代码中,我们使用了节点结构体来定义每个节点,然后定义了约瑟夫环类。约瑟夫环类包含了环的大小、头指针和尾指针,以及添加、删除和解决问题的方法。在解决问题的方法中,我们使用一个计数器来记录每次删除的人数,当计数器达到指定的值时,就删除当前节点。如果当前节点是最后一个节点,则将当前节点指向头节点。
在 main 函数中,我们首先从用户输入中获取环的大小和每次删除的人数,然后使用 for 循环向环中添加节点。最后,我们调用约瑟夫环类的 solve 方法来解决问题,并输出最后留下的人的编号。
约瑟夫问题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`作为参数,计算并返回存活的人的编号。用户可以在主函数中输入这两个值来解决问题。
阅读全文