04月19, 2019

Java-猜生日游戏

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进制数就得到生日日期。

根据这个方法同理可以猜测月份,甚至年份,大家可以自行探索! `

本文链接:http://www.iuutech.com/post/Java-猜生日游戏.html

-- EOF --

Comments