猜生日问题

最近看到一个有意思的问题,就是看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
读者自己也可以试试


运行效果如下:






                
### 使用C语言实现一个生日日期的程序 以下是一个完整的解决方案,展示如何利用C语言编写一个能够测用户生日的简单程序。该程序会提示用户提供一些关于其生日的信息,并逐步缩小范围直到找到确切的日期。 #### 主要思路 通过一系列问题引导用户输入特定信息(如月份、日子),从而逐渐锁定用户的实际生日[^1]。下面提供了一种可能的设计方案: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DAYS_IN_MONTH 31 int main() { int month, day; // 提示用户输入他们的生日所在月份 printf("你好! 我们来玩一个小游戏吧。\n"); printf("请告诉我你的生日在哪个月?(1-12): "); scanf("%d", &month); if (month < 1 || month > 12) { printf("错误:请输入有效的月份编号(1到12之间)!\n"); return 1; } // 根据不同月份设置最大天数 int max_days = 0; switch(month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: max_days = 31; break; case 4: case 6: case 9: case 11: max_days = 30; break; case 2: max_days = 29; // 假设考虑闰年情况下的最坏情形 break; } // 请求具体的日期 do{ printf("现在,请告诉我在第%d个月内哪一天是你生日? (%d-%d): ", month, 1, max_days); scanf("%d", &day); if(day < 1 || day > max_days){ printf("错误:对于所选月份(%d),有效日期应在1至%d之间的。\n", month, max_days); } }while(day < 1 || day > max_days); // 输出最终结果 printf("\n太棒啦!我已经知道你的生日了!\n"); printf("你的生日是在 %d 月 %d 日。\n", month, day); return 0; } ``` 这段代码首先询问用户他们生日所在的月份,接着依据选定的月份设定合理的日期区间,再让用户指定具体的日子。整个过程既直观又易于理解[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值