有n个人围成一圈,顺序排号。从第1人开始报数(从1到3),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。用c语言指针处理
时间: 2023-08-31 18:35:38 浏览: 85
### 回答1:
我们可以使用一个指针来遍历这个圈中的每一个人,并计算报数。当报数到达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时删除
### 回答2:
题目是经典的“约瑟夫环”问题,可以使用循环链表和指针来解决。
首先,创建一个循环链表,并依次给每个节点赋予一个初始编号1到n。
然后,设定一个计数器num,初始值为1,表示从第一个人开始报数。
接下来就可以进入循环,循环条件是链表中节点的个数大于1。
在循环中,首先通过指针找到当前报数的人节点,然后进行报数。
如果num的值等于3,则将该节点从链表中删除。
接着,更新num的值,使其加1。
最后,将指针指向下一个节点,开始下一轮的报数。
当链表中只剩下一个节点时,就得到了最后留下的人。
具体代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int num;
struct Node* next;
}Node;
int main()
{
int n;
printf("请输入人数n:");
scanf("%d", &n);
// 创建循环链表
Node* head = (Node*)malloc(sizeof(Node));
Node* p = head;
for (int i = 1; i <= n; i++)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->num = i;
p->next = newNode;
p = p->next;
}
p->next = head->next; // 将链表首尾相连
// 开始报数并删除
int num = 1;
Node* current = head->next; // 当前节点指针
while (n > 1)
{
if (num == 3)
{
// 删除当前节点
Node* temp = current->next;
current->next = temp->next;
free(temp);
num = 1;
n--;
}
else
{
num++;
current = current->next;
}
}
printf("最后留下的是原来第%d号的那位\n", current->num);
// 释放内存
free(current);
free(head);
return 0;
}
```
以上代码中,输入n表示总人数,程序输出的是最后留下来的人的原始编号。
例如,当输入n为7时,最后输出的结果为4。
### 回答3:
可以使用循环链表和指针来解决该问题。
首先,创建一个长度为n的循环链表,并用指针相互链接节点。接下来,创建一个指向头节点的指针,以及一个指向当前节点的指针。
然后,通过循环遍历链表,并在每次遍历过程中进行报数操作。当当前节点的报数为3时,将其从链表中移除,并将当前节点的下一个节点链接到链表上的前一个节点。同时,更新当前节点的指针为下一个未被移除的节点。
重复上述步骤,直到链表中只剩下一个节点为止。最后留下的节点就是原来第几号的那位。
具体的C语言代码如下所示:
```c
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int number;
struct Node* next;
} Node;
int findLastPerson(int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->number = 1;
head->next = NULL;
Node* current = head;
// 创建循环链表
for (int i = 2; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->number = i;
newNode->next = head;
current->next = newNode;
current = newNode;
}
// 开始报数并移除节点
int count = 1;
while (current->next != current) {
count++;
if (count == 3) {
Node* temp = current->next;
current->next = temp->next;
free(temp);
count = 0;
}
current = current->next;
}
int lastPerson = current->number;
free(current);
return lastPerson;
}
int main() {
int n;
printf("请输入人数n:");
scanf("%d", &n);
int lastPerson = findLastPerson(n);
printf("最后留下的是原来第%d号的人。\n", lastPerson);
return 0;
}
```
以上代码中的findLastPerson函数通过循环链表和指针的方式解决了问题,并返回最后留下的人的原来的编号。在main函数中,通过用户输入的方式获取人数n,并输出结果。
阅读全文