今天面试的时候出了一道智力题,帮忙给解解,最好把结果和推论过程说一下
有人想了两个不等的且大于1小于30的自然数,把和告诉了甲,把积告诉了乙,以下是甲乙双方的一段对话。甲说:“虽然我不知道这两个数是多少,但我确定你也不知道”乙说:“本来我是...
有人想了两个不等的且大于1小于30的自然数,把和告诉了甲,
把积告诉了乙,以下是甲乙双方的一段对话。
甲说:“虽然我不知道这两个数是多少,但我确定你也不知道”
乙说:“本来我是不知道的,现在经你这么一说,我就知道了”
甲说:“那我也知道这两个数是多少了”
你知道这两个数是多少吗?
这个题算难吗?你们面试见到过这样的题吗? 展开
把积告诉了乙,以下是甲乙双方的一段对话。
甲说:“虽然我不知道这两个数是多少,但我确定你也不知道”
乙说:“本来我是不知道的,现在经你这么一说,我就知道了”
甲说:“那我也知道这两个数是多少了”
你知道这两个数是多少吗?
这个题算难吗?你们面试见到过这样的题吗? 展开
3个回答
展开全部
微软面试题
#14楼 得分:0回复于:2002-03-15 14:15:30首先必须正确理解题设每句话所代表含义的约束条件;
其次在理解每句话时必须受到前面所有约束条件的限制;
随着甲乙互相问话,约束条件不断增加,最终得到唯一解.
*/
# include <stdio.h>
# include <math.h>
bool g_same; //true: (x <=y); false:(x <y)
// 已知两个1~30之间的数字,甲知道两数之和,乙知道两数之积。
bool cond0 (int x, int y)
{
return
(g_same ? (x <= y) : (x < y))
&& (x > = 1) && (x <= 30) && (y > = 1) && (y <= 30) ;
}
// 甲问乙:“你知道是哪两个数吗?”乙说:“不知道”;
// ( => B=x*y 有多解 )
bool cond1 (int x, int y)
{
int i, s=x*y, k=0 ;
for (i = 1 ; i <= sqrt(s) ; i++)
if ((s % i == 0) && cond0(i,s/i)) k++ ;
return (k > = 2);
}
// 乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”;
// ( => A=x+y 有多解 且每种解满足条件1 )
bool cond2 (int x, int y)
{
int i, s = x+y, k = 0 ;
for (i = 1 ; i <= s / 2 ; i++)
if (cond0(i,s-i) && cond1(i,s-i)) k++ ;
return (k > = 2);
}
// 于是,乙说:“那我知道了”;
// ( => 乙根据 条件1,条件2 得出唯一解 )
bool cond3 (int x, int y)
{
int i, s=x*y, k=0 ;
for (i = 1 ; i <= sqrt(s) ; i++)
if ((s % i == 0) && cond0(i,s/i) && cond1(i,s/i) && cond2(i,s/i)) k++ ;
return (k == 1);
}
// 随后甲也说:“那我也知道了”;
// ( => 甲根据 条件1,条件2, 条件3 得出唯一解 )
bool cond4 (int x, int y)
{
int i, s = x+y, k = 0 ;
for (i = 1 ; i <= s / 2 ; i++)
if (cond0(i,s-i) && cond1(i,s-i) && cond2(i,s-i) && cond3(i,s-i)) k++ ;
return (k == 1);
}
// 解毕
void main (void)
{
int i, j;
g_same=true; //允许重复
printf( "condition: (1 <= x <= y <= 30)\n ");
for (i = 1 ; i <= 30 ; i++)
for (j = 1 ; j <= 30 ; j++)
if (cond0(i,j) & cond1(i,j) & cond2(i,j) & cond3(i,j) & cond4(i,j))
printf ( "x=%d,\ty=%d,\tx+y=%d,\tx*y=%d\n ",i,j,i+j,i*j) ;
g_same=false; //不允许重复
printf( "\ncondition: (1 <= x < y <= 30)\n ");
for (i = 1 ; i <= 30 ; i++)
for (j = 1 ; j <= 30 ; j++)
if (cond0(i,j) & cond1(i,j) & cond2(i,j) & cond3(i,j) & cond4(i,j))
printf ( "x=%d,\ty=%d,\tx+y=%d,\tx*y=%d\n ",i,j,i+j,i*j) ;
}
注:我没试过,但编程正确
#14楼 得分:0回复于:2002-03-15 14:15:30首先必须正确理解题设每句话所代表含义的约束条件;
其次在理解每句话时必须受到前面所有约束条件的限制;
随着甲乙互相问话,约束条件不断增加,最终得到唯一解.
*/
# include <stdio.h>
# include <math.h>
bool g_same; //true: (x <=y); false:(x <y)
// 已知两个1~30之间的数字,甲知道两数之和,乙知道两数之积。
bool cond0 (int x, int y)
{
return
(g_same ? (x <= y) : (x < y))
&& (x > = 1) && (x <= 30) && (y > = 1) && (y <= 30) ;
}
// 甲问乙:“你知道是哪两个数吗?”乙说:“不知道”;
// ( => B=x*y 有多解 )
bool cond1 (int x, int y)
{
int i, s=x*y, k=0 ;
for (i = 1 ; i <= sqrt(s) ; i++)
if ((s % i == 0) && cond0(i,s/i)) k++ ;
return (k > = 2);
}
// 乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”;
// ( => A=x+y 有多解 且每种解满足条件1 )
bool cond2 (int x, int y)
{
int i, s = x+y, k = 0 ;
for (i = 1 ; i <= s / 2 ; i++)
if (cond0(i,s-i) && cond1(i,s-i)) k++ ;
return (k > = 2);
}
// 于是,乙说:“那我知道了”;
// ( => 乙根据 条件1,条件2 得出唯一解 )
bool cond3 (int x, int y)
{
int i, s=x*y, k=0 ;
for (i = 1 ; i <= sqrt(s) ; i++)
if ((s % i == 0) && cond0(i,s/i) && cond1(i,s/i) && cond2(i,s/i)) k++ ;
return (k == 1);
}
// 随后甲也说:“那我也知道了”;
// ( => 甲根据 条件1,条件2, 条件3 得出唯一解 )
bool cond4 (int x, int y)
{
int i, s = x+y, k = 0 ;
for (i = 1 ; i <= s / 2 ; i++)
if (cond0(i,s-i) && cond1(i,s-i) && cond2(i,s-i) && cond3(i,s-i)) k++ ;
return (k == 1);
}
// 解毕
void main (void)
{
int i, j;
g_same=true; //允许重复
printf( "condition: (1 <= x <= y <= 30)\n ");
for (i = 1 ; i <= 30 ; i++)
for (j = 1 ; j <= 30 ; j++)
if (cond0(i,j) & cond1(i,j) & cond2(i,j) & cond3(i,j) & cond4(i,j))
printf ( "x=%d,\ty=%d,\tx+y=%d,\tx*y=%d\n ",i,j,i+j,i*j) ;
g_same=false; //不允许重复
printf( "\ncondition: (1 <= x < y <= 30)\n ");
for (i = 1 ; i <= 30 ; i++)
for (j = 1 ; j <= 30 ; j++)
if (cond0(i,j) & cond1(i,j) & cond2(i,j) & cond3(i,j) & cond4(i,j))
printf ( "x=%d,\ty=%d,\tx+y=%d,\tx*y=%d\n ",i,j,i+j,i*j) ;
}
注:我没试过,但编程正确
展开全部
通过甲的第一句话“虽然我不知道这两个数是多少,但我确定你也不知道”可以知道甲知道的数字可以拆城的数字组合里面没有两个质数的组合比如12就不可以,因为12=5+7,但是5和7都是质数。万一是5和7,乙的积就是35而35只有可能5*7与甲的话不符。所以甲的话可以推测出甲知道的和拆成的数字组合里面一定没有两个质数的组合。其实这样就可以去掉很多数字了
乙的话“本来我是不知道的,现在经你这么一说,我就知道了”可以推测出乙知道的积肯定有多种组合,而且其中所有可能的 组合的和肯定是不能拆成两个质数的。比如积如果是18就不可以。因为18=9*2或者18=3*6万一是3和6的话,他们的和就是9,但是如果是9的话,甲就不会说那句话了。
最后就是甲的第二句话“那我也知道这两个数是多少了”这句话说明甲知道的和里面只有一种可能性能满足前面两句话中的限制。所以可以得出这两个数字是3和8。
和是11积是24。现在开始顺推:甲知道和是11有如下情况
2+9 3+8 4+77 5+6这四种可能性的积都有不止一种组合,比如2*9=18==3*6等等,不一一列举了。所以符合甲的第一句话。
乙知道积是24有以下几种可能性
3*8 4*6 2*12
其中无论4*6还是2*12他们的和都不满足甲的第一句话4+6=10=3+7
2+12=14=3+11他们都有可以拆开成两个质数的可能性。只有3和8才符合,所以乙说她知道了。
甲听到以说他知道了,甲也知道了因为无论2+9 4+7 5+6都不满足甲说出第一句话乙就能知道答案的要求所以答案就是3和8.
乙的话“本来我是不知道的,现在经你这么一说,我就知道了”可以推测出乙知道的积肯定有多种组合,而且其中所有可能的 组合的和肯定是不能拆成两个质数的。比如积如果是18就不可以。因为18=9*2或者18=3*6万一是3和6的话,他们的和就是9,但是如果是9的话,甲就不会说那句话了。
最后就是甲的第二句话“那我也知道这两个数是多少了”这句话说明甲知道的和里面只有一种可能性能满足前面两句话中的限制。所以可以得出这两个数字是3和8。
和是11积是24。现在开始顺推:甲知道和是11有如下情况
2+9 3+8 4+77 5+6这四种可能性的积都有不止一种组合,比如2*9=18==3*6等等,不一一列举了。所以符合甲的第一句话。
乙知道积是24有以下几种可能性
3*8 4*6 2*12
其中无论4*6还是2*12他们的和都不满足甲的第一句话4+6=10=3+7
2+12=14=3+11他们都有可以拆开成两个质数的可能性。只有3和8才符合,所以乙说她知道了。
甲听到以说他知道了,甲也知道了因为无论2+9 4+7 5+6都不满足甲说出第一句话乙就能知道答案的要求所以答案就是3和8.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这两个数有多个解,不唯一.
推导过程:1-30任何两个自然数相加后,其解都非唯一,但其积在特定的条件下唯一,如素数与素数相乘。因为甲告诉乙并确定乙不知道此两数,而乙知道两数的积,其积肯定为合数,否则就只能是唯一的答案了。
推导过程:1-30任何两个自然数相加后,其解都非唯一,但其积在特定的条件下唯一,如素数与素数相乘。因为甲告诉乙并确定乙不知道此两数,而乙知道两数的积,其积肯定为合数,否则就只能是唯一的答案了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询