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来实现“环”结构。
  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959470.html
Copyright © 2011-2022 走看看