C语言练习题-C语言练习题实例69
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序分析:使用循环和数组来模拟报数的过程,每报到3的人将其编号设为0,最后剩下的非零编号即为留下的人的编号。
实例
#include <stdio.h>
int main() {
int num[50], n, *p, j, loop, i, m, k;
printf("请输入这一圈人的数量:\n");
scanf("%d", &n);
p = num;
// 开始给这些人编号
for (j = 0; j < n; j++) {
*(p + j) = j + 1;
}
i = 0; // i用于计数,即让指针后移
m = 0; // m记录退出圈子的人数
k = 0; // k报数1,2,3
while (m < n - 1) { // 当退出的人数不大于总人数时,即留下的人数至少是一个人
if (*(p + i) != 0) { // 如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
k++;
}
if (k == 3) {
k = 0; // 报数清零,即下一个人从1开始报数
*(p + i) = 0; // 将报数为3的人编号重置为0
m++; // 退出人数加1
}
i++; // 指针后移
if (i == n) { // 这句很关键,如果到了队尾,就要使指针重新指向对头
i = 0;
}
}
printf("现在剩下的人是:");
for (loop = 0; loop < n; loop++) {
if (num[loop] != 0) {
printf("%2d号\n", num[loop]);
}
}
return 0;
}
以上程序执行输出结果为:
请输入这一圈人的数量:
8
现在剩下的人是: 7号
在上述代码中,我们使用数组num
来表示每个人的编号,初始时按顺序给每个人赋值编号。然后使用循环和指针p
来模拟报数的过程,每次报数为3的人将其编号设为0,并将退出人数m
加1。最后通过循环打印出非零编号的人,即为留下的最后一人。
请注意,输入的人数必须小于等于50,否则数组越界错误。