问题描述: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
例:
0 1 2 3 4 5 6
1 × n=7,k=1,+0)%8
2 × n=6,k=2,+1)%7
3 × n=5,k=3,+2)%6
4 × n=4,k=4,+3)%5
5 × n=3,k=5,+4)%4
6 × n=2,k=6,+5)%3
7 √
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