题目:有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,否则数组越界错误。

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想, c语言练习, c语言练习题