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

        public static Integer getResult(int n,int m){
            return n==1?n:(getResult(n-1, m)+m-1)%n+1;
            
        }

    问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。

    如果n=1时 则结果是1,设函数f(n,m)表示求取的函数,则只需要找到n 和n-1的关系  就可以根据递归找到f(n,m)的值

    原值old                新值new(执行完一次后去掉m后  形成的新的编号)

    1

    2

    3

    ...

    m-2                       n-2

    m-1                       n-1

    m

    m+1                      1

    m+2                      2

    ..

    n-1

    n

    所以得出old=(new +m)%n   为了避免new+m=n时的情况   所以改进成 old=(new+m-1)%n+1;

  • 相关阅读:
    du
    date
    echo
    redis的多实例
    redis相关配置
    mariadb的安装与主从复制
    11.Flask-钩子函数
    Python之Linux下的virtualenv&&virtualenvwrapper
    Linux的防火墙概念
    安装ipython解释器
  • 原文地址:https://www.cnblogs.com/xiatc/p/12372522.html
Copyright © 2011-2022 走看看