C语言指针解决以下问题有 n 个人围成一圈,顺序排号,从第 1 个人开始报数,从 1 报到 m,凡报到 m 的人退 出圈子,问最后留下的是原来第几号的人?下列函数完成上述处理,其中 m、n 的(m<n) 值由主调函数输入,函数返回值为所求结果
时间: 2023-06-09 12:04:33 浏览: 41
很好,我明白了你的问题。以下是给出的 C 语言代码:
```c
int josephus(int n, int m){
int i, s = 0;
for(i = 2; i <= n; ++i)
s = (s + m) % i;
return s + 1;
}
```
这个函数实现了约瑟夫问题,经典的约瑟夫问题是指有 n 个人围成一圈,顺序排号,从第 1 个人开始报数,报到 m 的人出圈,接着从出圈的下一个人开始重新报数,直到剩下最后一个人。这个问题可以用递归和迭代两种方式来实现,这里给出的是迭代实现方式。
相关问题
有n个人围成一圈,顺序排号。从第1人开始报数(从1到3),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。用c语言指针处理
我们可以使用一个指针来遍历这个圈中的每一个人,并计算报数。当报数到达3时,就将这个人从圈中删除,并继续遍历下一个人。我们可以使用一个循环来实现这个过程,并使用一个变量来记录剩余的人数。
例如,我们可以使用以下代码来实现这个过程:
```
#include <stdio.h>
int main(void) {
int n = 10; // 圈中的人数
int count = 0; // 计数器
int *p = malloc(n * sizeof(int)); // 分配内存空间
// 初始化每个人的编号
for (int i = 0; i < n; i++) {
p[i] = i + 1;
}
// 遍历圈中的每一个人
for (int i = 0; i < n; i++) {
count++; // 报数
if (count == 3) { // 如果报数到达3
count = 0; // 重置计数器
p[i] = 0; // 删除这个人
n--; // 剩余人数减1
}
}
// 打印最后留下的人的编号
for (int i = 0; i < n; i++) {
if (p[i] != 0) {
printf("%d\n", p[i]);
}
}
free(p); // 释放内存空间
return 0;
}
```
在这段代码中,我们使用了一个指针 `p` 来保存每一个人的编号,并使用两个循环遍历圈中的每一个人。在第一个循环中,我们使用计数器来记录报数,并在报数到达3时删除
n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来几号的那位,用c语言和指针
以下是使用C语言和指针实现的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int number;
struct Node* next;
} Node;
Node* createCircle(int n) {
Node* head = NULL;
Node* prev = NULL;
for (int i = 1; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->number = i;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
} else {
prev->next = newNode;
}
prev = newNode;
}
prev->next = head; // 将最后一个节点的next指向头节点,形成循环链表
return head;
}
int findLastPerson(int n, int m) {
Node* head = createCircle(n);
Node* current = head;
Node* prev = NULL;
while (current->next != current) {
for (int i = 1; i < m; i++) {
prev = current; current = current->next;
}
prev->next = current->next;
Node* temp = current;
current = current->next;
free(temp);
}
int lastPerson = current->number;
free(current);
return lastPerson;
}
int main() {
int n = 10; // n个人
int m = 3; // 每次报数到m的人退出
int lastPerson = findLastPerson(n, m);
printf("最后留下的是原来%d号的那位\n", lastPerson);
return 0;
}
```