ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

约瑟夫环问题

2020-02-27 15:52:07  阅读:277  来源: 互联网

标签:old int getResult 约瑟夫 问题 士兵 编号 new


    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;

标签:old,int,getResult,约瑟夫,问题,士兵,编号,new
来源: https://www.cnblogs.com/xiatc/p/12372522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有