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

来源:互联网 发布:义乌管家婆软件jhgjp 编辑:程序博客网 时间:2024/06/10 05:18

约瑟夫环:

已知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,constchar * 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;

}









0 0
原创粉丝点击