推测30以内具体数字

 已知两个1―30之间的数字,甲知道两数之和,乙知道两数之积. 甲问乙:“你知道是哪两个数吗?”乙说:“不知道”乙问甲:“你知道是哪两个数吗?”甲说:“不知道”.于是,乙说:“那我知道了”.随后甲也说:“那我也知道了.”问:这两个数是什么?

最近一个同事,问了我这么一个题目,作为码农,想都不用向暴力程序解了,大家看看代码吧

先举例子: 乘积是4的可以拆分为(1,4)(2,2) 以此类推

int main()
{
    int sum[1000];
    int  multiply[1000];
    FILE *fp = fopen("a.txt","w+");
    for(int i = 0; i<1000;i++)
        sum[i]=multiply[i] = 0;
    for(int i =1; i <= 30 ; i++) //统计出现相同和次数  统计出现相同积的次数
    {
        for(int j = i;j<=30; j++)
        {
            sum[i+j]++;
            multiply[i*j]++;
        }
    }
    fprintf(fp,"II: unknown:!\n");
    for(int i = 0; i<1000; i++)
    {
        if(multiply[i]>1)//乙不知道  输出出现相同积次数的乘积
        {
            fprintf(fp,"multiply: %3d  : count: %2d\n",i,multiply[i]);
        }
    }

    fprintf(fp,"I: unknown:!\n");
    int sum2[100];
    for(int i = 0; i<100; i++)
        sum2[i]=0;
    for(int m = 0; m<1000; m++) //在上次结果基础上 统计相同和的次数
    {
        if(multiply[m]>1)
        {
            for(int i = 1; i<=30; i++)
            {
                for(int j = i;j<=30;j++)
                {
                    if(i*j==m)
                    {
                        sum2[i+j]++;
                    }                   
                }
            }
        }
    }
    for(int i =1; i<100;i++)
    {
        if((sum2[i]>1)&&(sum[i]>1)) //输出相同和次数的 和
        {
            fprintf(fp,"sum = %3d: count1: %2d count2: %2d\n",i,sum[i],sum2[i]);
        }
    }
    fprintf(fp,"II: known:!\n");
    int m2[1000];
    for(int i =0; i<1000; i++)
        m2[i] = 0;
    for(int s = 1; s<100;s++) //在上次结果上统计 相同积的次数
    {
        if((sum2[s]>1)&&(sum[s]>1))
        {
            for(int i = 1; i<=30; i++)
            {
                for(int j = i;j<=30;j++)
                {
                    if((i+j)==s)
                    {
                        m2[i*j]++;
                    }                   
                }
            }
        }
    }

    for(int i =1; i<1000;i++)
    {
        if((multiply[i]>1)&&(m2[i]==1))//乙知道结果  统计只有一次的个数
        {
            fprintf(fp,"multiply: %3d  : count1: %2d  count2: %2d\n",i,multiply[i],m2[i]);
        }
    }
    
    fprintf(fp,"I: known:!\n");
    int s3[100];
    for(int i = 0; i< 100; i++)
    {
        s3[i] =0;
    }

    for(int m =1; m<1000; m++)
    {
        if((multiply[m]>1)&&(m2[m]==1))
        {
            for(int i = 1; i<=30; i++)
            {
                for(int j = i;j<=30;j++)
                {
                    if(i*j==m)
                    {
                        s3[i+j]++;
                    }                   
                }
            }
        }
    }

    for(int i =0; i<100; i++)
    {
        if((sum2[i]>1)&&(sum[i]>1)&&(s3[i]==1)) //甲知道结果  统计相同积的次数为1 的
        {
            fprintf(fp,"sum = %3d: count1: %2d count2: %2d count3=%d\n",i,sum[i],sum2[i],s3[i]);
        }
    }
    
    fprintf(fp,"answer:\n");
    for(int i = 1; i<=30; i++)
    {
        for(int j = i; j<=30; j++)
        {
            int s = i+j;
            int m = i*j;
            if((sum2[s]>1)&&(sum[s]>1)&&(s3[s]==1)&&(multiply[m]>1)&&(m2[m]==1))//满足所有条件的结果
            {
                fprintf(fp,"(%d,%d)\n",i,j);
            }
        }
    }
    fclose(fp);

}

输出结果:

II: unknown:!
multiply:   4  : count:  2
multiply:   6  : count:  2
multiply:   8  : count:  2
multiply:   9  : count:  2
multiply:  10  : count:  2
multiply:  12  : count:  3
multiply:  14  : count:  2
multiply:  15  : count:  2
multiply:  16  : count:  3
multiply:  18  : count:  3
multiply:  20  : count:  3
multiply:  21  : count:  2
multiply:  22  : count:  2
multiply:  24  : count:  4
multiply:  25  : count:  2
multiply:  26  : count:  2
multiply:  27  : count:  2
multiply:  28  : count:  3
multiply:  30  : count:  4
multiply:  32  : count:  2
multiply:  36  : count:  4
multiply:  40  : count:  3
multiply:  42  : count:  3
multiply:  44  : count:  2
multiply:  45  : count:  2
multiply:  48  : count:  4
multiply:  50  : count:  2
multiply:  52  : count:  2
multiply:  54  : count:  3
multiply:  56  : count:  3
multiply:  60  : count:  5
multiply:  63  : count:  2
multiply:  64  : count:  2
multiply:  66  : count:  2
multiply:  70  : count:  2
multiply:  72  : count:  4
multiply:  75  : count:  2
multiply:  78  : count:  2
multiply:  80  : count:  3
multiply:  81  : count:  2
multiply:  84  : count:  4
multiply:  88  : count:  2
multiply:  90  : count:  4
multiply:  96  : count:  3
multiply: 100  : count:  3
multiply: 104  : count:  2
multiply: 105  : count:  2
multiply: 108  : count:  3
multiply: 110  : count:  2
multiply: 112  : count:  3
multiply: 120  : count:  5
multiply: 126  : count:  3
multiply: 130  : count:  2
multiply: 132  : count:  2
multiply: 135  : count:  2
multiply: 140  : count:  3
multiply: 144  : count:  4
multiply: 150  : count:  3
multiply: 154  : count:  2
multiply: 156  : count:  2
multiply: 160  : count:  2
multiply: 162  : count:  2
multiply: 168  : count:  4
multiply: 176  : count:  2
multiply: 180  : count:  4
multiply: 182  : count:  2
multiply: 189  : count:  2
multiply: 192  : count:  2
multiply: 196  : count:  2
multiply: 198  : count:  2
multiply: 200  : count:  2
multiply: 208  : count:  2
multiply: 210  : count:  3
multiply: 216  : count:  3
multiply: 220  : count:  2
multiply: 224  : count:  2
multiply: 225  : count:  2
multiply: 234  : count:  2
multiply: 240  : count:  4
multiply: 252  : count:  3
multiply: 260  : count:  2
multiply: 264  : count:  2
multiply: 270  : count:  3
multiply: 280  : count:  2
multiply: 286  : count:  2
multiply: 288  : count:  2
multiply: 300  : count:  3
multiply: 308  : count:  2
multiply: 312  : count:  2
multiply: 324  : count:  2
multiply: 330  : count:  2
multiply: 336  : count:  3
multiply: 360  : count:  3
multiply: 364  : count:  2
multiply: 378  : count:  2
multiply: 390  : count:  2
multiply: 400  : count:  2
multiply: 420  : count:  3
multiply: 432  : count:  2
multiply: 450  : count:  2
multiply: 480  : count:  2
multiply: 504  : count:  2
multiply: 540  : count:  2
multiply: 600  : count:  2
I: unknown:!
sum =   5: count1:  2 count2:  2
sum =   6: count1:  3 count2:  2
sum =   7: count1:  3 count2:  3
sum =   8: count1:  4 count2:  3
sum =   9: count1:  4 count2:  4
sum =  10: count1:  5 count2:  5
sum =  11: count1:  5 count2:  5
sum =  12: count1:  6 count2:  4
sum =  13: count1:  6 count2:  6
sum =  14: count1:  7 count2:  4
sum =  15: count1:  7 count2:  7
sum =  16: count1:  8 count2:  6
sum =  17: count1:  8 count2:  8
sum =  18: count1:  9 count2:  6
sum =  19: count1:  9 count2:  8
sum =  20: count1: 10 count2:  6
sum =  21: count1: 10 count2:  7
sum =  22: count1: 11 count2:  7
sum =  23: count1: 11 count2:  9
sum =  24: count1: 12 count2:  7
sum =  25: count1: 12 count2:  9
sum =  26: count1: 13 count2:  8
sum =  27: count1: 13 count2: 10
sum =  28: count1: 14 count2:  9
sum =  29: count1: 14 count2: 11
sum =  30: count1: 15 count2: 10
sum =  31: count1: 15 count2: 11
sum =  32: count1: 15 count2:  8
sum =  33: count1: 14 count2:  9
sum =  34: count1: 14 count2:  9
sum =  35: count1: 13 count2:  7
sum =  36: count1: 13 count2:  6
sum =  37: count1: 12 count2:  8
sum =  38: count1: 12 count2:  5
sum =  39: count1: 11 count2:  5
sum =  40: count1: 11 count2:  4
sum =  41: count1: 10 count2:  6
sum =  42: count1: 10 count2:  2
sum =  43: count1:  9 count2:  4
sum =  44: count1:  9 count2:  2
sum =  45: count1:  8 count2:  2
sum =  46: count1:  8 count2:  2
II: known:!
multiply:   4  : count1:  2  count2:  1
I: known:!
sum =   5: count1:  2 count2:  2 count3=1
answer:
(1,4)

答案是 1 和4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值