约瑟夫环(java)

问题描述:n个人围成一圈,每隔k个杀死一个,问最后的幸存者的编号

假设标号是0 ~ n-1,幸存者是f[n]

1、特殊情况:f[1]=0

2、一般情况:f[n] = (f[n-1]+k)%n

游戏开始时排序:

0、1、2、3、4、5、6、7、8……n-1

第一次被杀死的人的标号是k-1,还剩下n-1个人,此时的排序是:

k、k+1、k+2、k+3……n-1、0、1、2……k-3、k-2

重新排序:

0、1、2、3……n-5、n-4、n-3、n-2

    private static int josephus(int n, int m) {
        if (n == 1) {
            return 0;
        } else {
            return (josephus(n - 1, m) + m) % n;
        }
    }

问题描述:n个人围成一圈,从第一个开始报数,第i次报数时,报到i的出局,问最后的幸存者的编号

假设标号是0 ~ n-1,幸存者是f[n, k]

1、特殊情况:f[1]=0

2、一般情况:f[n, k] = (f[n-1, k+1]+k)%n

例:

1次 0 1 2 3 4 5 6 n=7,k=1,+1)%7
2次 1 2 3 4 5 6 \ 0 1 2 3 4 5 n=6,k=2,+2)%6
3次 2 3 4 5 0 0 1 2 3 4 n=5,k=3,+3)%5
4次 3 4 0 1 0 1 2 3 n=4,k=4,+4)%4
5次 0 1 2 0 1 2 n=3,k=5,+5)%3
6次 原2 0 现0 1 n=2,k=6,+6)%2
7次 0

比如,f(3,5)=(f(2,6)+5)%3 若f(2,6)现在的数字是0,则原来数字是2

    private static int josephus_(int n, int m) {
        if (n == 1) {
            return 0;
        } else {
            return (josephus_(n-1, m+1) + m) % n;
        }
    }
原文地址:https://www.cnblogs.com/angelica-duhurica/p/10903583.html