typedef unsigned long u32 /* 将无符号长整型取别名为u32 */
typedef signed long s32 /* 将有符号长整型取别名为s32 */
typedef enum Boolean { /* 定义一个枚举类型,将1取名为True(真),0为False(假) */
True=1,
False=(!True)
} Boolean
Boolean isTypeA(u32 naturalNumber) /* isTypeA函数原型 */
int main()
{
u32 i=1
Boolean type
s32 amountOfA=0,amountOfB=0 /* 两个变量分别统计A类数和B类数 */
while(type=isTypeA(i),i<=1000)
{
if(type)
++amountOfA
else
++amountOfB
++i
}
printf("1到1000中A类数有%ld个,B类有%ld个\n",amountOfA,amountOfB)
return 0
}
Boolean isTypeA(u32 naturalNumber)
{
u32 n=naturalNumber
s32 numberOf0=0,numberOf1=0
while(n>0)
{
if( 0==(n&1) ) /* 判断1个无符号数最低位为0还是为1 */
++numberOf0
else
++numberOf1
n=n>>1 /*向右移1位*/
}
if(numberOf1>numberOf0)
return True
else
return False
}
1. 两个聪明人闲来无事,邀他们的秘书玩这样一个游戏:秘书在2和100之间选两个数,把和给一个人,乘积给另一个,让他们算出这两个数。于是有了下面的对话:- 光凭这个乘积,我算不出来。
- 我已经知道你算不出来。
- 那... 我算出来了。
- 那... 我也算出来了。
聪明的你,是否也算出来了?
2. 已知:x和y都是自然数,且x>1,y<30.
我把x+y的结果告诉了甲,把x*y的结果告诉了乙。
甲说:“我不知道x和y各是多少。”
乙说:“我也不知道x和y各是多少。”
甲又说:“我知道x和y是多少了。”
接着乙也说:“我也知道x和y是多少了”。
请问:x和y各是多少。
3. 一个经理有三个女儿,三个女儿的年龄加起来等于13,三个女儿的年龄乘起来等于经理自己的年龄,有一个下属已知道经理的年龄,但仍不能确定经理三个女儿的年龄,这时经理说只有一个女儿的头发是黑的,然后这个下属就知道了经理三个女儿的年龄。请问三个女儿的年龄分别是多少?为什么?
答案:
第一题:
这道题我想了很久,终于得出了答案,我本来想使解答清晰明了,但我觉得这道题挺复杂,下面请看我的“长篇大论”。
首先我来列出100以内的质数:2、3、5、7、11、13、17、19、23、29、31、37.....共25个。
将这些数任取2个求和,得到一组数称为A类数,100以内的A类数为5、7、8、9、10、12、13、14、15、16、18、19、20、21、22、24、25、26、28、30、31、32、34.....
把只能表示为两个合数之和的数称为B类数:11、17、23、27、29、33、35、37、.......
下面我们来看这道题:我的答案这两个数是4、13
甲看到的积是52,有两种可能4、13或2、26,所以他说:“光凭这个乘积,我算不出来。”同时他知道乙看到的和也只有两种可能17或28。其中17属B类数,28属A类数。
因为乙说:“我已经知道你算不出来”,所以甲能确定乙看到的一定是个B类数17,我来说明一下为什么:因为按照B类数的定义,17有如下几种分法17=2+15,17=3+14,17=4+13,17=5+12,17=6+11,17=7+10,17=8+9。也就是说17分解成的两个加数里一定有合数,无论哪种分法乙都能保证乘积等于30、42、52、60、66、70、72的两个数不确定,所以乙敢说:我已经知道你算不出来。反过来看,假如乙看到的和是A类数他可就不敢说这话了,比如28=11+17,乙又怎敢保证甲不是因为看到乘积187而把两个数确定呢?
综上所述,所以甲能确定乙看到的一定是B类数,也就是17。所以甲确定了这两个数是4、13,所以他说:“那... 我算出来了。”
之后我再来说明为什么乙也能确定这两个数。
乙看到和为17,按照前面的分析,甲看到的积有7种可能:30、42、52、60、66、70、72
其中52我们已经分析过了,有两种分法:52=4*13,52=2*26。而4+13=17(B类),2+26=28(A类),乙知道甲能靠着A类数和B类数的区别确定这两个数。
而其他情况呢?42=3*14,42=2*21。而3+14=17(B类),2+21=23(B类),由于有两组B类数,乙知道甲无法确定这两个数。
30=2*15,30=5*6。而2+15=17(B类),6+5=11(B类),也是两组B类
60=5*12,60=3*20。而5+12=17(B类),3+20=23(B类)
66=6*11,66=2*33。而6+11=17(B类),2+33=35(B类)
70=7*10,70=2*35。而7+10=17(B类),35+2=37(B类)
72=8*9,72=3*24。而8+9=17(B类),3+24=27(B类)
综上,除了52外,其他每一个积都有两组B类数干扰,所以乙能确定这两个数是4、13。
第二题:
两个数是3和4
甲看到和是7时,有两种可能2、5或3、4,所以他说:“我不知道x和y各是多少。” 同时甲知道乙看到的积也只有两种可能10或12。
假如乙看到的是10,那么乙就能确定这两个数是2、5,既然乙说:“我也不知道x和y各是多少。”所以这个积一定不是10,所以这个积是12。
所以甲和乙先后知道了这两个数是3、4
第三题:
三个女儿年龄是1、3、9,经理年龄是27岁(结婚够早的啊)
这道题从答案逆推就比较好理解了,27只有2种分法27=1*3*9或27=3*3*3(因为总不会是1、1、27吧,女儿跟爹一样大??)
假如三个女儿都是3岁,排除极端的情况那么三个女儿应该是三胞胎,但经理说:“只有一个女儿的头发是黑的”就排除了三胞胎的可能(请注意这是数学推理题不是生物题,要是有朋友非说先生下一对双胞胎以后隔10隔月又生下一个黑头发,那我顿时无语,此题就无解了。我觉得黑头发的条件一定是这么用的----排除三胞胎的可能)
所以3个女儿的年龄就确定了1、3、9。
解:□□□□,1~8A类,奇数=奇数+偶数=偶数+奇数,
前两位为奇数,后两位至少一个偶数;或后两位为奇数,前两位至少一个偶数,
B类,偶数=奇数+奇数=偶数+偶数
四位全是奇数;或前两位至少一个偶数,后两位至少一个偶数
总数为8×8×8×8
(1)奇奇奇偶,奇奇偶奇,奇奇偶偶;奇偶奇奇,偶奇奇奇,偶偶奇奇。A类:(4×4×4×4+4×4×4×4+4×4×4×4)×2个,
占总数的(4×4×4×4+4×4×4×4+4×4×4×4)×2/(8×8×8×8)=3/8
(2)奇奇奇奇;奇偶奇偶,奇偶偶偶,奇偶偶奇;偶奇奇偶,偶奇偶偶,偶奇偶奇。B类占总数的1-3/8=5/8
所以A类数的个数占B类数个数的百分比是3/5=60%
参考资料:http://hi.baidu.com/chisir001/blog/item/516259d742e7732506088beb.html