您的位置:首页 > 其它

约瑟夫环

2016-01-20 09:49 190 查看
今天做了一个有趣的题:定义1-100共100个数,逢3出列,打印最终出列的数字清单.

后来才知道,这是计算机科学和数学中有名的约瑟夫环问题.

特别科普一下

问题来历

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

下面是我写的代码

import java.util.ArrayList;
/*  @Desciption 定义1-100共100个数,逢3出列,打印最终出列的数字清单
* @Version 1.0 * /

public class HW15122801 {
public static void main(String args[]) {
PString ps = new PString(100);
ps.Print(); }
}

class PString {
private int len;
private ArrayList<Integer> al = new ArrayList<>();
PString(int alen) {
len = alen;
for (int i = 0; i < len; i++) {
al.add(i+1);
}
}
public void Print(){
int jg = 0;   //定义间隔计数表,当=3时清零重新计算
int num = 0;  //定义找到的总数计数表,当=len时结束查找
ArrayList<Integer> cun = new ArrayList<>();  //定义一个存放查找结果的数组
while(num!=len){
for(int i=0;i<al.size();i++){
jg++;
if(jg==3){
cun.add(al.get(i));
al.remove(i);      //找到一个元素后继续查找,超过数组长度时清零重新查找直到找完len个元素
jg=0;
num++;
i--;
}
}
}
prAl(cun);
}
public void prAl(ArrayList<Integer> aAl){
for(int i:aAl)   System.out.print(i+" ");
}
}


执行结果:

3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 2 7 11 16 20 25 29 34 38 43 47 52 56 61 65 70 74 79 83 88 92 97 1 8 14 22 28 35 41 49 55 62 68 76 82 89 95 4 13 23 32 44 53 64 73 85 94 5 19 37 50 67 80 98 17 40 59 86 10 46 77 26 71 31 100 58 91

如果改成故事中的41人,执行结果为:

3 6 9 12 15 18 21 24 27 30 33 36 39 1 5 10 14 19 23 28 32 37 41 7 13 20 26 34 40 8 17 29 38 11 25 2 22 4 35 16 31
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: