zoukankan      html  css  js  c++  java
  • 算法:约瑟夫环问题

    算法:约瑟夫环问题

    问题描述

      约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从第一个人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,求最后一个出圈的人的标号。

    题目分析

    C语言实现

    void JOSEF(int n,int m) //:n个人,m出列
    {
        int people[n+1]; //我们定义的数组大小为n+1,因为我们不想涉及到0的操作,我们只取1到n这个范围内的标号,忽略0
        for(int i=1;i<=n;i++)
            people[i]=i; //将数组内(除0)的每一个元素进行初始化,其实非0即可,值无所谓。
        int flag=n-1;    //我们要在数组里面删除多少个元素呢?答案是n-1个。剩下的一个为最后出圈的那一个
        int p=1;         //用来指示元素下标
        int count=0;     //计数器
        
        while(flag)      //没有删完的情况下继续
        {
            if(people[p]==0)  //如果p所指的元素为0,表示该元素已经出圈,可以跳过
            {
                if(p==n)      //这段代码就是让尾部连接头部
                        p=1;
                else
                        p++;
                continue;
            }
            count++;       //找打一个不为0的元素
            if(count==m)   //如果我们找够m个,就将这个元素出圈,也就是设为0
            {
                people[p]=0;     
                flag--;    //待出圈的元素-1
                count=0;   //重新开始数
            }
            if(p==n)       //这段代码就是让尾部连接头部
                p=1;
            else
                p++;
        }
      
      for(int i=1;i<n;i++)  //那个值不为0元素的下标的就是最后一个出圈的人的序号
      {
        if(people[i]!=0)
        {printf("目标为%d
    ",i);break;}
      }
    

      

  • 相关阅读:
    sqlserver-一次updlock和withnolock和with check option 的报错原因分析
    类库文件引用web服务报错解决方法-在 ServiceModel 客户端配置部分中,找不到引用协定的默认终结点元素
    用timer自定义计划任务时间
    console 程序随系统启动及隐藏当前程序窗口
    爱积多合作农场正式上线试运营
    CSS-三列布局
    CSS-垂直居中
    form表单重置
    CSS3 选择器
    Tab选项卡
  • 原文地址:https://www.cnblogs.com/MrSaver/p/5926544.html
Copyright © 2011-2022 走看看