c语言编程n个人围城一圈,顺序排号从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。要求用指针实现
时间: 2023-12-23 09:10:27 浏览: 82
有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。.txt
下面是使用C语言指针实现的围城游戏程序:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, *p, *q, count = 0;
printf("请输入围成一圈的人数:");
scanf("%d", &n);
p = (int*) malloc(n * sizeof(int));
q = p;
for (int i = 0; i < n; i++) {
*(p++) = i + 1;
}
p = q;
while (n > 1) {
for (int i = 0; i < n; i++) {
count++;
if (count == 3) {
count = 0;
for (int j = i; j < n - 1; j++) {
*(p + j) = *(p + j + 1);
}
n--;
}
}
}
printf("最后留下的人是原来第%d号的那位\n", *p);
free(q);
return 0;
}
```
程序中,我们首先通过 `malloc()` 函数动态分配了一个大小为 `n * sizeof(int)` 的内存空间,并将指针 `p` 指向该空间的首地址。然后,我们使用 `for` 循环将 1 到 n 的数字依次存储到该内存空间中。接下来,我们使用指针 `q` 保存指针 `p` 的初始值,以便在程序结束时释放该内存空间。
在进入主循环之前,我们先将指针 `p` 重新指向该内存空间的首地址,然后使用 `while` 循环,直到只剩下一个人。在每次循环中,我们使用 `for` 循环遍历所有人,并使用变量 `count` 记录当前报数的次数。当 `count` 等于 3 时,我们就将该人从内存空间中删除,并将剩余人数减 1。
最后,我们输出留下的人的编号,并使用 `free()` 函数释放该内存空间。
阅读全文