猜生日 Java小游戏
最近看到一个很有趣的小游戏:
询问朋友5个问题,找到他出生在一个月的哪一天。每个问题都是询问他的生日是否是5个数字集合中的一个。
这5个集合分别是:
set1:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
set2:2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31
set3:4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31
set4:8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
set5:16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
生日是出现这一天的每个集合的第一个数字之和,例如生日是19,那么它会出现在集合1、2和5中,三个集合的第一个数字分别是1、2和16,它们的和就是19。
用Java实现就是:
package 贪心;
/*
作者 :XiangLin
创建时间 :2020/9/21 10:53
文件 :GussBirthday.java
IDE :IntelliJ IDEA
*/
import java.util.Scanner;
public class GussBirthday {
public static void main(String[] args) {
String set1 =
"1 3 5 7\n" +
"9 11 13 15\n" +
"17 19 21 23\n" +
"25 27 29 31";
String set2 =
"2 3 6 7\n" +
"10 11 14 15\n" +
"18 19 22 23\n" +
"26 27 30 31";
String set3 =
" 4 5 6 7" +
"\n 12 13 14 15" +
"\n 20 21 22 23" +
"\n 28 29 30 31";
String set4 =
" 8 9 10 11" +
"\n 12 13 14 15" +
"\n 24 25 26 27" +
"\n 28 29 30 31";
String set5 =
" 16 17 18 19" +
"\n 20 21 22 23" +
"\n 24 25 26 27" +
"\n 28 29 230 31";
int day = 0;
// Create Scanner
Scanner input = new Scanner(System.in);
// Prompt the user to answer questions
System.out.println("Is your birthday in Set1?\n");
System.out.println(set1);
System.out.println("\nEnter 0 for No and 1 for Yes: ");
int answer = input.nextInt();
if (answer == 1)
day += 1;
// Prompt the user to answer questions
System.out.println("Is your birthday in Set2?\n");
System.out.println(set2);
System.out.println("\nEnter 0 for No and 1 for Yes: ");
answer = input.nextInt();
if (answer == 1)
day += 2;
// Prompt the user to answer questions
System.out.println("Is your birthday in Set3?\n");
System.out.println(set3);
System.out.println("\nEnter 0 for No and 1 for Yes: ");
answer = input.nextInt();
if (answer == 1)
day += 4;
// Prompt the user to answer questions
System.out.println("Is your birthday in Set4?\n");
System.out.println(set4);
System.out.println("\nEnter 0 for No and 1 for Yes: ");
answer = input.nextInt();
if (answer == 1)
day += 8;
// Prompt the user to answer questions
System.out.println("Is your birthday in Set5?\n");
System.out.println(set5);
System.out.println("\nEnter 0 for No and 1 for Yes: ");
answer = input.nextInt();
if (answer == 1)
day += 16;
System.out.println("\nYour birthday is " + day + "!");
}
}
输出:
Is your birthday in Set1?
1 3 5 7
9 11 13 15
17 19 21 23
25 27 29 31
Enter 0 for No and 1 for Yes:
1
Is your birthday in Set2?
2 3 6 7
10 11 14 15
18 19 22 23
26 27 30 31
Enter 0 for No and 1 for Yes:
1
Is your birthday in Set3?
4 5 6 7
12 13 14 15
20 21 22 23
28 29 30 31
Enter 0 for No and 1 for Yes:
0
Is your birthday in Set4?
8 9 10 11
12 13 14 15
24 25 26 27
28 29 30 31
Enter 0 for No and 1 for Yes:
0
Is your birthday in Set5?
16 17 18 19
20 21 22 23
24 25 26 27
28 29 230 31
Enter 0 for No and 1 for Yes:
1
Your birthday is 19!
这个游戏是很容易编程的。你可能很好奇想知道如何创建这个游戏。实际上,这个游戏背后的数学
知识是非常简单的。这些数字不是随意组成一组的。它们放在五个集合中的方式是经过深思熟虑的。这五个集合的第一个数分别是1、2、4、8和16
,它们分别对应二进制数的1、10、100、1000和10000
。从1到31的十进制数最多用五个二进制数就可以表示,如图3-2a所示。假设它是b5b4b3b2b1,那么
b5b4b3b2b1=b50000 + b4000 + b300 + b20+b1,如图所示。如果某天的二进制数在b位为整数1,那么该数就该出现在Setk中。例如:数字19的二进制是10011,所以它就该出现在集合1、集合2和集合5中。它就是二进制数1+10+10000=10011
或者十进制数1+2+16=19
。数字31的二进制是11111,所以它就会出现在集合1,集合2、集合3、集合4和集合5中。它就是二进制数1+10+100+1000+10000=11111
,或是十进制数1+2+4+8+16=31
。
几百本常用电子书免费领取:https://github.com/XiangLinPro/IT_book
