zoukankan      html  css  js  c++  java
  • C语言经典算法100例-069-简单约瑟夫环问题

    这里我们实现一个简单的约瑟夫环问题,描述如下:

    有N个人站成一圈,从第一个人开始报数,从1报到3,报到3的那个人走出圈,然后从下一个人开始从1继续报数,重复上面的过程,直到最后圈里只剩下一个人,问这个人是哪个人?

    分析:首先,我们要给这N个人编号,分别编为1到N,

    然后,开始报数,同时记录 当前编号,所报数,圈内人数,

    只要圈内人数大于1,就一直重复,

    报数过程中,如果所报数为3,那么要做这几件事:1,将这个人踢出圈 2,圈内人数减一 3,重置所报数。

    具体实现起来如代码所示:

    //n 个人,报数,去3,剩下几号-简单约瑟夫环问题
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_SIZE 20
    
    int main()
    {
        int Ring[MAX_SIZE];
        int i, n;
        int cnt;    //代表报的数
        int pos;    //当前位置数
        int num;    //当前环中的人数
        int *p = Ring;    //用指针访问数组
    
        //输入环中的初始人数
        printf("input the n.
    ");
        scanf("%d", &n);
    
        //输入一些元素
        for (i = 0; i < n; i++)
            *(p+i) = i+1;
    
        //报数 去3
        num = n;
        pos = 0;
        cnt = 0;
        
        while (num != 1)    //一直报到剩下一个人
        {
            if(*(p + pos) != 0) ++cnt;  //对当前元素报数
            if (cnt == 3)       //报到3了
            {
                *(p + pos) = 0;         //踢出环
                --num;          //环大小-1
                cnt = 0;        //重置报的数
            }
            ++pos;                //指向下一个元素
            if(pos == n)        //到环尾则返回环头
                pos = 0;
        }
        while (*p == 0) p++;    //找到最后剩下的那个元素
        printf("%d is left",*p);
    
        return 0;
    
    }
    
    这里用数组表示约瑟夫环,数组内元素置0表示不在环内,当位置累积到N时置0来实现“环”结构。
  • 相关阅读:
    Python学习--not语句
    【图论】有向无环图的拓扑排序
    算法精解:DAG有向无环图
    Python xrange() 函数
    自然语言处理课程(二):Jieba分词的原理及实例操作
    Jieba分词原理与解析
    ios面试题整理
    OC语言Block和协议
    OC内存管理
    IOS 开发-- 常用-- 核心代码
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959470.html
Copyright © 2011-2022 走看看