算法: 约瑟夫问题(Joseph Problem)的分析

问题描述:

n个人(编号由0, 1, ..., n-1)围成一圈,由编号0的人从1开始报数,报到m的退出,剩下的人继续从1开始报数,直到圈内只剩余1人,求胜利者的编号。(n>0, m>0)


分析:

固定m, 视n为变量。定义F(n)为: n人时,胜利者的编号。

则n 人时,胜利者编号为

0,  1,  2,  3,  …,  m-1(*), m, m+1,  …, n-1;

去掉一人后,还剩余n-1人。 且这n – 1 人与n人时的index对应关系如下:

m,   m+1, …., n-1,  0, 1, 2, 3, ….., m -2

0,     1,      …,       …,       ……… ,       n-2.  (总共n-1个人)

则F(n)  = F(n-1) + m;

最后再考虑 m与n的关系, m可能会大于n. 所以需要取模

F(n) = ( F(n-1) + m  ) %n.

代码:

《算法: 约瑟夫问题(Joseph Problem)的分析》

测试代码: 模拟真实的问题,逐个数数,逐个删除。

《算法: 约瑟夫问题(Joseph Problem)的分析》

调用的main函数:

《算法: 约瑟夫问题(Joseph Problem)的分析》

测试结果:

《算法: 约瑟夫问题(Joseph Problem)的分析》

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/wlqingwei/article/details/44037693
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞