C语言题目 AB类数 求源代码 和详细备注

Python014

C语言题目 AB类数 求源代码 和详细备注,第1张

#include<stdio.h>

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~8

A类,奇数=奇数+偶数=偶数+奇数,

前两位为奇数,后两位至少一个偶数;或后两位为奇数,前两位至少一个偶数,

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