用能看的懂的方法模拟约瑟夫环

本文详细解析了约瑟夫环问题,通过一维数组存储和遍历的方式实现了该问题的算法。介绍了如何使用for循环和while循环来处理约瑟夫环中的人员出列过程,并讨论了算法实现中的难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

约瑟夫环:

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;
他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

知识点:
1. 一维数组的赋值 遍历和存储
2.for循环 , while 循环


难点:
1.出列一圈后,剩下人的该怎么标记 和出列 , 才不会出现重复和漏掉


代码实现:

#import <Foundation/Foundation.h>


//从编号为k的人开始报数

#define K 1


// 数到M的人出列

#define M 4


// 总人数N

#define N 15



int main(int argc,const char * argv[]) {

    

    // 存在一个数组里面

    int p[N] = {0};

    

    // 这个数组用来保存出列的人

    int b[N] = {0};

    

    // 定义变量

    int count = 0; // 计数器 数到M个人后出列

    

    int num = 0; // 循环结束计数器 保证N个人全出来后停止循环

    

    int index = 0;// 定义一个变量记录存储位置

    

    // 让人拿上个随机的编号10 ~ 100,看到这个数就代表这个人

    for (int i = 0; i < N; i++) {

        

        p[i] = arc4random() % (100 - 10 + 1) + 10;

        

        printf("%d\t" , p[i]);

    }

    

    // 人没有出来完就一直循环

    while (num < 15) {

        

        for (int i = 0; i < N; i++) {

            

            if (p[i] != 0) {

                count++;

                

                //如果 count = M出列,报道这个数的人出列

                if(count == M){

                    

                    // 将出圈的元素按序存储在b

                    b[index++] = p[i + K - 1];

                    

                    // 将出圈的元素赋值为 0 ; 以后不在记录

                    p[i] = 0;

                    

                    // 出圈计数器count重置为0;

                    count = 0;

                    

                    // 出列计数器 num +1

                    num++;

                }

            }

        }

    }

    

    printf("\n出列顺序为:\n------------------------------------\n");

    

    // 打印出圈的值

    for (int i = 0; i < N; i++) {

        

        printf("%d\t" , b[i]);

   

    }

    

    return 0;

}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值