c语言题目描述 用指针实现:有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 输入 最初总人数n(2≤n≤100)。 输出 最后留下的人在最初所排的序号。 样例输入 11
时间: 2023-12-27 11:10:32 浏览: 115
以下是用 C 语言编写的程序,实现了上述问题的要求:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
int n i, m, *a, *p;
printf("请输入总人数n:\n");
scanf("%d", &n);
a = (int*)malloc(n * sizeof(int)); // 动态分配数组空间
p = a + n; // 指向数组尾部
for (i = 0; i < n; i++) {
*(a + i) = i + 1; // 初始化数组
}
i = 0; // 从第一个人开始报数
m = 0; // 报数1,2,3
while (n > 1) {
if (*(a + i) != 0) {
m++;
}
if (m == 3) {
*(a + i) = 0;
m = 0;
n--;
}
i++;
if (i == n) {
i = 0; // 回到开头
}
}
for (i = 0; i < n; i++) {
if (*(a + i) != 0) {
printf("最后留下的人在最初所排的序号:%d\n", *(a + i));
break;
}
}
free(a); // 释放数组空间
return 0;
}
```
程序先通过 `malloc` 函数动态分配了一个大小为 `n` 的整型数组 `a`,然后将数组中的元素初始化为 1,2,3,...,n。接着,使用 `i` 和 `m` 两个变量分别表示当前报数的人和报数的数值,如果报数为 3,则将当前报数的人标记为 0,并将人数 `n` 减1。最后,遍历整个数组,找到第一个不为 0 的元素,输出该元素的值即可。
需要注意的是,程序中使用了指针来操作数组,指针 `p` 指向的是数组最后一个元素的下一个位置,这样在遍历数组时就可以避免数组越界的问题。同时,程序中使用了动态分配数组空间的方法,避免了数组大小的限制。
阅读全文