这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
题目描述
从1-31中选择一个数字,经过程序执行后,得出猜想的数字:
解题思路
这里用到了,数字二进制的特点。
我们把1到31这些数字全部转换为二进制,二进制最多占用五位。
将第一位为1的数字放到集合set1中
将第二位为1的数字放到集合set2中
以此类推,我们有了五个集合,set1到set5
这个时候我们分别将要猜的数字与五个集合作比较,如果在该集合中有该数字,就把这一位置位1。
假设我们猜的数字是5,5的五位二进制数是00101.
我们再set1中找到了5,所以将第一位置位1,变为00001(最开始的数字为0,00000)
然后在set3中找到了5,将第三个位置置位1,变为00101
程序代码
package day_01;
import java.util.Scanner;
public class 猜数字 {
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 34";
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 30 31";
int day=0;
Scanner scanner=new Scanner(System.in);
System.out.println("以下set中是否有你猜的数字:");
System.out.println(set1);
System.out.print("有输入1,没有输入0");
int answer=scanner.nextInt();
day+=answer*1;
System.out.println("以下set中是否有你猜的数字:");
System.out.println(set2);
System.out.print("有输入1,没有输入0");
answer=scanner.nextInt();
day+=answer*(1<<1);
System.out.println("以下set中是否有你猜的数字:");
System.out.println(set3);
System.out.print("有输入1,没有输入0");
answer=scanner.nextInt();
day+=answer*(1<<2);
System.out.println("以下set中是否有你猜的数字:");
System.out.println(set4);
System.out.print("有输入1,没有输入0");
answer=scanner.nextInt();
day+=answer*(1<<3);
System.out.println("以下set中是否有你猜的数字:");
System.out.println(set5);
System.out.print("有输入1,没有输入0");
answer=scanner.nextInt();
day+=answer*(1<<4);
System.out.println("你猜的数字是:"+day);
}
}
结果演示
要猜的数字为22