猜生日问题

最近看到一个有意思的问题,就是看5组数里有没有你生日所在的那一天,然后就猜出你的生日是几号

我照书上个简单的GUI程序,来实现它

 

package 猜生日;
import javax.swing.JOptionPane;

public class GuessBirthdayUsingConfirmationDialog {

	/**
	 * @param args
	 */
	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 30 31";
		
		int day=0;
		
		//Prompt the user to answer questions
		int answer=JOptionPane.showConfirmDialog(null, 
				"Is your birthday in these numbers?\n"+set1);
		
		if(answer==JOptionPane.YES_OPTION)
			day+=1;
		
		answer=JOptionPane.showConfirmDialog(null,
				"Is your birthday in these numbers?\n"+set2);
		
		if(answer==JOptionPane.YES_OPTION)
			day+=2;
		
		answer=JOptionPane.showConfirmDialog(null, 
				"Is your birthday in these numbers?\n"+set3);
		
		if(answer==JOptionPane.YES_OPTION)
			day+=4;
		
		answer=JOptionPane.showConfirmDialog(null,
				"Is your birthday in these numbers\n"+set4);
		
		if(answer==JOptionPane.YES_OPTION)
			day+=8;
		
		answer=JOptionPane.showConfirmDialog(null,
				"Is your birthday in these numbers?\n"+set5);
		
		if(answer==JOptionPane.YES_OPTION)
			day+=16;
		
		JOptionPane.showMessageDialog(null, "Your birthday is "+
				day+"!");

	}

}


其实这问题仔细想想也挺有意思的

为什么刚好是5个问题,原来一个月最多31天,5个问题回答是和否最多32种情况

包含了其中的每一天,再仔细看看那5组数据都是有特点的

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 30 31";

第一组16个数表示的就是二进制最低位是1的所有数字 (例如1的二进制是1)3,5,7...都是

第二组16个数表示的就是二进制第二位是1的数字(例如2的二进制是10)

第三组16个数表示的就是二进制第三位是1的数字(例如4的二进制是100)

第四组16个数表示的就是二进制第四位是1的数字(例如8的二进制是1000)

第五组16个数表示的就是二进制第五位是1的数字(例如16的二进制是10000)

读者可以根据这个规律自己写出这5组数据

 

二进制数中有一位定下来了,其他4位没定,所以每组数据就有32/2=16个了

猜的时候只要记住被猜人回答哪一组里面有他生日的,我们先初始化他的生日为0号

如果第一组有,就+1

第二组有,就+2

第三组有,就+4

第四组有,就+8

第五组有,就+16

读者自己也可以试试


 

 


 


 


 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值