• 约瑟夫环


    今天做了一个有趣的题:定义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

  • 相关阅读:
    Photoshop快捷键大全
    [转载]Ajax 教程:Ajax 入门简介
    Windows 7环境下安装Apache Http Server 2.2.19
    Words For Today [20110710]
    Words For Today [20110708]
    Words For Today [20110709]
    Eclipse的Spring库导入
    克隆虚拟机+Linux互相登录+秘钥认证(四)
    java+appium 自动化环境搭建
    VMware虚拟机安装Linux后忘记root密码怎么办(三)
  • 原文地址:https://www.cnblogs.com/runwulingsheng/p/5144125.html
Copyright © 2020-2023  润新知