已知两个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)