约瑟夫环算法

算法一: 巧妙的算法,具体原理有待补充

 

int Josephus(int M,int N){

//总人数 M ,数到第 N 个排除。

int i,k;

for(i=2,k=0;i<=M;i++)

k=(k+N)%i;

return ++k;

}

算法二: 经典算法

 public class Josephas

 2    {

 3        //从第start人开始计数,以alter为单位循环记数出列,总人数为total

 4        public int [ ] Jose(int total, int alter, int start)    

 5        {         

 6            int i, j, k = 0;

 7

 8             //count数组存储按出列顺序的数据,以当结果返回

 9            int[] count = new int [ total+1];   

10

11            //s数组存储初始数据

12            int[] s = new int [ total+1];    

13

14             //对数组s赋初值,第一个人序号为0,第二人为1,依此下去

15            for (i = 0; i <total; i++)    

16            {

17                s[i] = i;

18            }

19

20            //按出列次序依次存于数组count中

21            for (i = total; i >= 2; i–)     

22            {

23                start = (start + alter – 1) % i;

24                if (start == 0)

25                    start = i;

26                count[k] = s[start];

27                k++;

28                for (j = start + 1; j <= i; j++)

29                    s[j – 1] = s[j];

30            } 

31              

32            count[k]=s[1];

33

34            //结果返回

35            return count;    

36        }

37    }

注:算法来源于网络..

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