从2到100中选择2个数字
将这2个数的“和”告诉A,又将这2个数的“积”告诉B。
A说:我如果不知道这2个数,B你一定也不知道。
B想了一会说:本来我不知道,现在我知道了。
A过了一会又说:现在我知道了。

请问:这2个数是什么?

要求用SQL来解决,如果用别的方法也可以。需要有计算过程。


推理过程:
“张三看了看“和”,说“你肯定不知道这两个数字是多少。””

李四不知道这两个数字是多少,说明这两个数字不可能都是质数,否则将这两个数字的积(设为A)分解质因数既可还原。
同样A不可能有大于50的质因数,否则A只有一种拆分方法(其他拆分方法必有大于100的因数)。

既然张三可以肯定李四不知道这两个数字,说明这两个数的和(设为B)不可能分解为两个质数的和。因为任何大于4的偶数都可以分解为两个质数之和(哥德巴赫猜想),所以,这B必为奇数,也就是说这两个数是一奇一偶。
同样B不可能等于“质数+2”
另:B不可能大于54。因为任何大于54的数都可以拆分成53+X的形式,而53和任意自然数的积一定有质因数53,与上述分析矛盾。
这样两数之和B的范围大大缩小。
那么这两个数的和B只可能等于:
11 17 23 27 29 35 37 41 47
中的一个。

"李四听了这话,想了想,说,“那么,我现在知道这两个数字是多少了。”"
看看各种可能的B的各种拆分方式所得到的积:
11(2*9=18、3*8=24、4*7=28、5*6=30)
17(2*15=30、3*14=42、4*13=52、5*12=60、6*11=66、7*10=70、8*9=72)
23(2*21=42、……)
……
47(……)
可以看出,30、42等作为积出现了不止一次,所以两数之积A不可能是30、42等。
我们把这样的数从上表中划去,剩下的数就是可能的积,而对应的拆分方法我们称之为可能拆分。
这个工作量比较大,先不忙划,继续往下分析。

“ 张三听了李四的话,也说:“那我也知道是多少了”。”
这句话说明,最终的B值只包含一种可能拆分。
好,我们再看。
11可拆分为4+7和8+3,均为可能拆分。(因为28和24均不可能有其它的奇数*偶数的表示形式了)。
23可拆分为4+19和16+7,均为可能拆分。(因为68和112均不可能有其它的奇数*偶数的表示形式了)。
27可拆分为4+23和8+19。
35可拆分为4+31,16+19和32+3。
37可拆分为8+29和32+5。
47可拆分为4+43和16+31。
另:
29可拆分为6+23和16+13均为可能拆分
41可拆分为4+37和10+31,均为可能拆分。(请读者自己验证)
好了,现在只剩下17。
拆拆看:
17(2*15=30、3*14=42、4*13=52、5*12=60、6*11=66、7*10=70、8*9=72)
不难验证,其中30、42、60、66、70、72均不是可能的A值,只有4*13一种拆分方法。
所以答案:
4和13!


create table #t(f int)
declare @i int
set @i=2
while @i<=100
begin
 insert into #t select @i
 set @i=@i+1
end


--求积、和,下面要老用这个表
select a.f*b.f as 积,a.f+b.f as 和,a.f as a,b.f as b
 into #sum from #t a, #t b where a.f>b.f


--1.1:导致积唯一的两个数之和
select a+b as 和 into #Step1_1 from #sum
 where 积 in(--积的数值唯一
  select 积 from #sum
   group by 积 having count(1)=1)

--1.2:a拿到的和应该在以下列表中
select distinct 和
 into #Step1_2 from #sum
  where 和 not in
   (select 和 from #Step1_1)


--2.1:b根据#Step1_2信息可以确定唯一,b的积就在下面
select distinct 积 into #Step2_1 from #sum
 where 和 in
  (select 和 from #Step1_2)
   group by 积 having count(1)=1


--3.1 三表关联一下,可以得到同时满足a和b拿到数值得组合
select #sum.* into #Step3_1 from #sum,#Step1_2,#Step2_1
 where #sum.和=#Step1_2.和
  and #sum.积=#Step2_1.积
--3.2 a知道了,所以a的和在#Step3_1中唯一

select 和 into #Step3_2 from #Step3_1
 group by 和
  having count(1)=1
--3.3 满足a的和唯一的纪录,在#Step3_1中正好只有一条
select * from #Step3_1
 where 和 in (select 和 from #Step3_2)


drop table #t
drop table #sum
drop table #Step1_1
drop table #Step1_2
drop table #Step2_1
drop table #Step3_1
drop table #Step3_2

/*--测试结果

积 和 a b
----------- ----------- ----------- -----------
52 17 13 4
--*/