C语言经典的约瑟夫问题案例

题目描述

编号为1~n的n个人围成一圈,假设从第2个人开始报数(从1到3报数),凡数到3的人退出圈子,然后下一个人又从1到3报数,数到3的人退出圈子,…,直到所有人都退出圈子,编程输出这n个人退出的序号。

实现代码

要解决这个问题,可以使用数组来表示圈子中的人,并使用一个变量来记录当前报数的位置。按照题目的要求,每次报数到3的人将退出圈子,直到所有人都退出。

以下是使用C语言编写的程序,可以输出n个人退出圈子的序号:

#include <stdio.h>

void josephus(int n) {
    int circle[1000];  // 假设最多有1000个人
    int count = 0;     // 当前报数的位置
    int remain = n;    // 剩余在圈子中的人数

    // 初始化圈子中的人
    for (int i = 0; i < n; i++) {
        circle[i] = i + 1;
    }

    // 开始报数并退出圈子
    while (remain > 0) {
        count = (count + 2) % remain;  // 每次报数到3,所以加2
        printf("%d ", circle[count]);

        // 将退出的人之后的人依次前移一位
        for (int i = count; i < remain - 1; i++) {
            circle[i] = circle[i + 1];
        }

        remain--;  // 圈子中的人数减少1
    }
    printf("\n");
}

int main() {
    int n;
    printf("请输入人数n:");
    scanf("%d", &n);

    printf("退出圈子的序号:");
    josephus(n);

    return 0;
}

在主函数中,我们首先通过 scanf 函数获取用户输入的人数n。然后调用 josephus 函数来输出退出圈子的序号。

这个程序会按照题目要求,从第2个人开始报数,每次报数到3的人退出圈子,直到所有人都退出。输出结果即为退出圈子的序号。

运行结果

图片[1]-C语言经典的约瑟夫问题案例-QQ沐编程

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享