美文网首页
Java-猜生日游戏

Java-猜生日游戏

作者: 青葱烈马 | 来源:发表于2019-01-11 11:43 被阅读3次

    5个问题找出他出生在一个月的哪一天,每个问题都是在问他的生日是否在数字集合中。
    生日是出现这一天的每个集合的第一个数字之和。

    import javax.swing.JOptionPane;
    public class GuessBirthday {
      public static void main(String[] args){
          String s1=
            "1 3 5 7\n"+
            "9 11 13 15\n"+
            "17 19 21 23\n"+
            "25 27 29 31";
          String s2=
            "2 3 6 7\n"+
            "10 11 14 15\n"+
            "18 19 22 23\n"+
            "26 27 30 31";
          String s3=
            "4 5 6 7\n"+
            "12 13 14 15\n"+
            "20 21 22 23\n"+
            "28 29 30 31";
          String s4=
             "8 9 10 11\n"+
             "12 13 14 15\n"+
             "24 25 26 27\n"+
             "28 29 30 31";
          String s5=
            "16 17 18 19\n"+
            "20 21 22 23\n"+
            "24 25 26 27\n"+
            "28 29 30 31";
          int day=0;
          int ans=JOptionPane.showConfirmDialog(null, "你的生日在这些数字中吗?\n"+s1);
          if(ans==JOptionPane.YES_OPTION)
              day+=1;
    
          ans=JOptionPane.showConfirmDialog(null, "你的生日在这些数字中吗?\n"+s2);
          if(ans==JOptionPane.YES_OPTION)
              day+=2;
    
          ans=JOptionPane.showConfirmDialog(null, "你的生日在这些数字中吗?\n"+s3);
          if(ans==JOptionPane.YES_OPTION)
              day+=4;
    
           ans=JOptionPane.showConfirmDialog(null, "你的生日在这些数字中吗?\n"+s4);
          if(ans==JOptionPane.YES_OPTION)
              day+=8;
    
           ans=JOptionPane.showConfirmDialog(null, "你的生日在这些数字中吗?\n"+s5);
          if(ans==JOptionPane.YES_OPTION)
              day+=16;
          JOptionPane.showMessageDialog(null, "你的是"+day+"日!");
      }
    }
    
    原理的话,涉及到一些二进制相关的知识。
    
    从1到31的十进制数最多用5位的二进制数就可以表示:
    
    十进制 二进制
    1   00001
    2   00010
    3   00011
    …    
    19 10011
    …    
    31  11111
    
    
    假设二进数表示为b5b4b3b2b1,
    
    而这5个Set中的数分别是b1为1的集合,b2为1的集合,b3为1的集合,b4为1的集合,b5为1的集合,
    
    如果某天的bk位为1,那么该数就出现在Setk中,
    
    例如:  19的二进制数为10011,所以它就出现在Set1,Set2,Set5中;
    
         30的二进制数为11111,所以它在Set1~Set5中都有出现。
    
    总之就是5个集合确定5位二进制数中对应位置上的值是1还是0,出现在集合中为1,未出现为0,最后组成一个5位二进制数,换算成10进制数就得到生日日期。
    
     
    
    根据这个方法同理可以猜测月份,甚至年份,大家可以自行探索!
    

    相关文章

      网友评论

          本文标题:Java-猜生日游戏

          本文链接:https://www.haomeiwen.com/subject/pbztdqtx.html