1.约瑟夫环的由来:
据说著名犹太历史学家约瑟夫(Josephus)有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
2.通俗解释:
就是41个人围城一个圈,每一个人的位置都代表一个数字。从一个位置开始报数,只要是3的倍数就要被旁边的人杀掉,如果那个位置的人被杀掉就跳过那个人的位置继续报数。请问最后活下来的人的位置是几号?在小编看来如此精辟的游戏丝毫不亚于“俄罗斯轮盘”-----真是紧张又刺激哦!不过也从侧面说明了一个问题,脑子真是个好东西!后来-------"电脑"出现了。幸运的是,能读到这篇文章的朋友毫无疑问都是有 "电脑子"的人。相信在看完这篇文章之后----“你我皆是约瑟夫”!!!
3.java实现思路
面对此类在java当中,毫无疑问最现想到的是数组,但是受制于数组的不易增删元素的特性,我们瞬间想到了ArrayList集合.
步骤:
-1.定义一个记录数的变量,用于对是否为3的位置信息进行判定。
-2.建立一个ArrayList集合将每个人所代表的位置数通过遍历元素的方式传入集合当中
-3.定义一个变量用于对索引值进行动态调整(这里我们叫他指针)
-4.通过for循环遍历的方式对符合条件的元素进行筛选操作集合对象对于元素的选择
4.代码实现
import java.util.ArrayList;
public class demo7 {
public static void main(String[] args) {
System.out.println("最幸运的数字:"+getLucklyNum(41));
}
/*
获取幸运数字的方法
1.返回值类型int
2.类型参数为int num
*/
public static int getLucklyNum(int num){
ArrayList<Integer> list = new ArrayList<>();//创建集合存储1~num的对象
for(int i=1;i<=num;i++){
list.add(i);//将1~num存储在集合当中
}
int count=1;//用来数数的,只要是3的倍数就杀人
int i;//定义一个指针也是用于控制删除元素所用
for(i=0;list.size() !=1;i++){ //只要集合中人数超过1就要不断的杀,i就相当于指针
if(i==list.size()){//如果i增长到list集合最大的索引+1时就重新归0(当一轮筛选后将指针重回0继续筛选)
i=0;
}
if(count %3==0){//如果是3的倍数(只是针对索引值,而不是每个数的值)就杀人
System.out.println("i的值:"+i);
list.remove(i--);//与list.remove(i)一样只不过i自身进行了减一也就是i的值回到了2。
System.out.println(list);
}
count ++;//count数继续增加
System.out.println("count的值:"+count);//输出count的值看是否符合规律
}
return list.get(0);
}
}
运行结果如下图所示:
count的值:2
count的值:3
i的值:2
集合所剩元素:[1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:4
count的值:5
count的值:6
i的值:4
集合所剩元素:[1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:7
count的值:8
count的值:9
i的值:6
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:10
count的值:11
count的值:12
i的值:8
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:13
count的值:14
count的值:15
i的值:10
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:16
count的值:17
count的值:18
i的值:12
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:19
count的值:20
count的值:21
i的值:14
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:22
count的值:23
count的值:24
i的值:16
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:25
count的值:26
count的值:27
i的值:18
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:28
count的值:29
count的值:30
i的值:20
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:31
count的值:32
count的值:33
i的值:22
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41]
count的值:34
count的值:35
count的值:36
i的值:24
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 39, 40, 41]
count的值:37
count的值:38
count的值:39
i的值:26
集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:40
count的值:41
count的值:42
i的值:0
集合所剩元素:[2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:43
count的值:44
count的值:45
i的值:2
集合所剩元素:[2, 4, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:46
count的值:47
count的值:48
i的值:4
集合所剩元素:[2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:49
count的值:50
count的值:51
i的值:6
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:52
count的值:53
count的值:54
i的值:8
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:55
count的值:56
count的值:57
i的值:10
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:58
count的值:59
count的值:60
i的值:12
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 32, 34, 35, 37, 38, 40, 41]
count的值:61
count的值:62
count的值:63
i的值:14
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 37, 38, 40, 41]
count的值:64
count的值:65
count的值:66
i的值:16
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40, 41]
count的值:67
count的值:68
count的值:69
i的值:18
集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40]
count的值:70
count的值:71
count的值:72
i的值:2
集合所剩元素:[2, 4, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40]
count的值:73
count的值:74
count的值:75
i的值:4
集合所剩元素:[2, 4, 8, 11, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40]
count的值:76
count的值:77
count的值:78
i的值:6
集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 26, 29, 31, 34, 35, 38, 40]
count的值:79
count的值:80
count的值:81
i的值:8
集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 34, 35, 38, 40]
count的值:82
count的值:83
count的值:84
i的值:10
集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 35, 38, 40]
count的值:85
count的值:86
count的值:87
i的值:12
集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 35, 38]
count的值:88
count的值:89
count的值:90
i的值:2
集合所剩元素:[2, 4, 11, 16, 17, 22, 25, 29, 31, 35, 38]
count的值:91
count的值:92
count的值:93
i的值:4
集合所剩元素:[2, 4, 11, 16, 22, 25, 29, 31, 35, 38]
count的值:94
count的值:95
count的值:96
i的值:6
集合所剩元素:[2, 4, 11, 16, 22, 25, 31, 35, 38]
count的值:97
count的值:98
count的值:99
i的值:8
集合所剩元素:[2, 4, 11, 16, 22, 25, 31, 35]
count的值:100
count的值:101
count的值:102
i的值:2
集合所剩元素:[2, 4, 16, 22, 25, 31, 35]
count的值:103
count的值:104
count的值:105
i的值:4
集合所剩元素:[2, 4, 16, 22, 31, 35]
count的值:106
count的值:107
count的值:108
i的值:0
集合所剩元素:[4, 16, 22, 31, 35]
count的值:109
count的值:110
count的值:111
i的值:2
集合所剩元素:[4, 16, 31, 35]
count的值:112
count的值:113
count的值:114
i的值:0
集合所剩元素:[16, 31, 35]
count的值:115
count的值:116
count的值:117
i的值:2
集合所剩元素:[16, 31]
count的值:118
count的值:119
count的值:120
i的值:0
集合所剩元素:[31]
count的值:121
最幸运的数字:31
Process finished with exit code 0
可以看到最后集合当中只剩下16和31两个元素,如果约瑟夫的朋友是个顽固派,那么约瑟夫就不得不把朋友给干掉。最终活下来的依旧是聪明的约瑟夫。看完之后,不得不感慨犹太人是真有意思啊。想必这便是赌命的最高境界,不过约瑟夫是老千!也告诉我们一个道理,不要赌博!好了,这就是本期博文。如果你有更好的方法欢迎来到我的评论区交流。