鬼谷子问徒问题是一套非常经典的逻辑推理题,在大厂面试中也经常遇到该种问题的变种。那么先来简述一下什么是鬼谷子问徒问题?
![14dcf545c11ed1fdd1195beb7cb11faf.png](https://i-blog.csdnimg.cn/blog_migrate/e2aded23f4941a7433afbad0a07d21c4.jpeg)
一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓,把这两个数的乘积告诉了孙膑,但孙膑和庞涓彼此不知到对方得到的数。
第二天,庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知道。
随后,孙膑说:本来我不知道,现在知道了,庞涓随后说:那我也知道了。
刚一开始看到这句话的时候,顿时怀疑人生,通过这几句话就能得到两个数,这是在逗我玩呢?后来经过资料查询,それが判明した。
![f0d220bdc0df7afcdc023c733db2d77e.png](https://i-blog.csdnimg.cn/blog_migrate/63041c35c44485ec849d768c19087e92.jpeg)
那么接下来先通过文字来解析一下背后的真理。
- 首先第一句话:虽然我不知到这两个数是什麽,但我知道你一定也不知道。 从这句话说明孙手里拿到的两个数肯定都不是素数(什么是素数?就是除了1和它本身以外不再有其他因数的自然数),不然的话,孙通过知道庞的和就可以唯一判断出这两个数字了
- 推理一:比如A=a+b,B=a*b;B=15,A=8,那么很容易就猜想到了a=3,b=5 (因为对15进行拆分只有一种可能),所以对庞的第一句话产生了矛盾;那么a,b两个数可能是一个奇数,一个偶数;另外有位大神认为任意大于4的偶数都能被拆成两个奇质数之和,但由于两个质数都要小于99,所以庞手上的数可能为偶数,但这个偶数会接近200(有182,184,188,190,192,196和198),除此之外,只可能是奇数;举例:如果庞涓手上是28,可以拆成11+17,当孙膑拿到了187这个积,马上就可以猜出鬼谷子给他的两个数是11和17,与庞涓肯定孙膑不知道这两个数相矛盾,因此有可能拆成两个2-99的质数和的数都要排除因此有可能拆成两个2-99的质数和的数都要排除
- 推理二:庞的和数一定不是大于55的数。因为大于53的数始终能够拆成质数53和另一个大于2的数,在2-99的限制下,这两个数的乘积只有这唯一一种拆分方法。举例:如果庞手上的和数是57,可以拆成53+4,当孙膑拿到212这个积,只有4*53这一种拆分可能性,因为2*106的另一种拆分方法导致有一个数超过99。由此排除55以上的所有所有数因此最后满足以上条件的这样的数字仅有11个:11,17,23,27,29,35,37,41,47,51,53。
- 第二句话:本来我不知道,现在知道了;这说明孙看了自己手上的积后,分解因式对应的所有拆分情况中有且仅有一种,两个因数的和是以上11个数中的一个。
- 第三句话:那我也知道了;由于庞涓并不知道两数积,所以只能从以上表格出发确定,最后得到两个数字分别是4和13
![655a04d23e05d4b92efdd1c51b4b46b6.png](https://i-blog.csdnimg.cn/blog_migrate/eab70f95156c7d21e1d31c6c09862e1c.jpeg)
也许上面的解析并不通俗易懂,其中涉及到很多数学知识和推理能力,如果感兴趣可以基于上述讲解自行进行推导;其实这道题的本质是基于每次的问题进行排除,尽可能的缩小范围,最后得到结果;那么最后通过SQL的方式来解决这类问题,或许通过sql(基于HQL)的方式可以帮助读者更加清晰理解
![49b6fd18394138ee76e9016ef1837844.png](https://i-blog.csdnimg.cn/blog_migrate/bfea9b7ed9c827d470d71f89595a33c5.jpeg)
sql逻辑
![59478cfc9b6e301bbeee0ce6223c92a4.png](https://i-blog.csdnimg.cn/blog_migrate/1e183fe84d1b04618c4dffa1c5ac3b75.jpeg)
结果展示