需求分析:
给出指定的集合;接收用户反馈的数字(0/1);设计算法根据用户输入的数字判断用户心中选择的数字;
涉及到的知识:
输入输出流;位运算;循环语句;
算法分析:
生日只能是1,28,1,29,1,30,1,31号中的某一天,不会超过31天,所以用[1,31]天完全能够表示生日的号数,31的二进制位11111=00001+00010+00100+01000+10000,也就是:
00001--------------1
00010--------------2
00100--------------4
01000--------------8
+
10000--------------16
———————————————————————
11111--------------31
---------------------------------------------
然而我们知道,二进制只能由0或者1组成,所以一个数字[1,31]的各个位数只能是0或者1,
所以由上面的数组合可以组合相加,可以得到任意一个数字。这样的话,我们任意取一个数字,
其二进制表示为:ABCDE(注:对应A表示二进制由左往右第一位,B第二位,C第三位,D第四位,E第五位。
例:10110,则(A=1,B=0,C=1,D=1,E=0)
则ABCDE可以由如下算式得到:
0000E
000D0
00C00
0B000
+
A0000
———----
ABCDE
---------------------------------------------
显然这个ABCDE是任意的,并且A,B,C,D,E要么为0要么为1。这样我们可以将对应的生日放在5个集合的某个集合中,规则是:
如果这个数的E=1(不限定其他位数字),那么就应该放在集合set1中。
如果这个数的D=1(不限定其他位数字),那么就应该放在集合set2中。
如果这个数的C=1(不限定其他位数字),那么就应该放在集合set3中。
如果这个数的B=1(不限定其他位数字),那么就应该放在集合set4中。
如果这个数的A=1(不限定其他位数字),那么就应该放在集合set5中。
注:可能一个生日会放在多个集合中。
当将这些生日放置在不同的集合中后,通过指定某个生日存在于5个集合中的哪些集合。我们便可以轻易的得到这个生日号数。
例:生日19号,其二进制为10011,那么我们会将它放置到set1,set2,set5中。
这样当你指定说某个数在集合set1,set2,set5,那么我们便知道,你说的某数必然是E=1,D=1,C=0,B=0,A=1
很容易的我们便可以猜出你说的某数为1+2+0+0+16=19。
import javax.swing.*;
public class GuessBirthday {
public static void main(String[] args) {
//定义存放生日号码字符串的数组
String[] str = new String[]{"1 3 5 7\n" + "9 11 13 15\n"+ "17 19 21 23\n" + "25 27 29 31\n",
"2 3 6 7\n" + "10 11 14 15\n" + "20 21 22 23\n" + "26 27 30 31\n",
"4 5 6 7\n" + "12 13 14 15\n" + "20 21 22 23\n" + "28 29 30 31\n",
"8 9 10 11\n" + "12 13 14 15\n" + "24 25 26 27\n" + "28 29 30 31\n",
"16 17 18 19\n" + "20 21 22 23\n" + "24 25 26 27\n" + "28 29 30 31\n"};
int day=0;
for (int i = 0; i < str.length; i++) {
//调出带有选项 Yes、No 和 Cancel 的对话框;标题为 Select an Option。
int answer = JOptionPane.showConfirmDialog(null, "Is your birthday in this strings?\n" + str[i]);
//如果选择是的话代表在这个字符串中,否则不在这里面
//static int YES_OPTION : 选择 YES 时从类方法返回的值。
if(answer == JOptionPane.YES_OPTION){
day+=inWhichStrings(i);
}
}
/*调出标题为 "Message" 的信息消息对话框。
参数:
parentComponent - 确定在其中显示对话框的 Frame;如果为 null 或者 parentComponent 不具有 Frame,则使用默认的 Frame
message - 要显示的 Object*/
JOptionPane.showMessageDialog(null,"your birthday is "+day+"!");
}
private static int inWhichStrings(int i) {
int num=0;
switch(i){
case 0:
num=1;
break;
case 1:
num=2;
break;
case 2:
num=4;
break;
case 3:
num=8;
break;
case 4:
num=16;
break;
}
return num;
}
}