花潮论坛

搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: 紫荆棘鸟

[智力答题] 一道只需加减乘除的题(转)

[复制链接]
  • TA的每日心情
    开心
    2025-1-7 04:54
  • 签到天数: 236 天

    [LV.7]常住居民III

    155

    主题

    6159

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥多彩人生心曲飞扬星星情怀七彩绚丽鹰傲苍穹飞龙在天大将风范共看流星风雨同行我心永远指尖上的流年花潮版主

    发表于 2020-10-23 22:14 来自手机 | 显示全部楼层
    紫荆棘鸟 发表于 2020-10-23 19:29
    恰好所有和为偶数的组合(两个偶数,或者两个奇数)都是应该排除的,
    它们不能通过第一话的检测
    因为它 ...

    根据你的提示,用最笨的代入法验算,甲得到的数字(和)可以是11.
    2+9。2/9=18=3\6。
    3+8。3/8=24=4/6=2/12
    4+7。4/7=28=2/12
    5+6。5/6=30=15/2

    都不存在唯一答案。
    乙根据自己得到的积可以推算出来
    但是甲为什么也知道了?
  • TA的每日心情
    慵懒
    2020-12-25 07:11
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    117

    主题

    2335

    回帖

    6344

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪春风拂面缤纷心情七彩绚丽心香一瓣紫色情节妙笔生花共看流星

     楼主| 发表于 2020-10-23 22:49 | 显示全部楼层
    四海八荒 发表于 2020-10-23 22:14
    根据你的提示,用最笨的代入法验算,甲得到的数字(和)可以是11.
    2+9。2/9=18=3\6。
    3+8。3/8=24=4/6= ...

    等下贴我的解答,解答比较长,看完需要耐心:)
    珠藏泽自媚,玉韫山含辉。
    博客:新浪博客 & 万维读者博客
  • TA的每日心情
    慵懒
    2020-12-25 07:11
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    117

    主题

    2335

    回帖

    6344

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪春风拂面缤纷心情七彩绚丽心香一瓣紫色情节妙笔生花共看流星

     楼主| 发表于 2020-10-24 00:32 | 显示全部楼层
    解答比较长,看完需要一定的耐心。若是看明白了,还是有意思的。

    先统一记号,假设这两个数为 (a,b),其中
            2 <= a < b <= 100,s = a + b,p = a*b
    这样甲得到的数字是 s (表示和 sum),乙得到的数字是 p (表示乘积 product)。(a,b) 总共有 C(99,2)=99*98/2 = 4851 种组合。

    先来看第一句话。“ 甲:我不知道那两个数字是什么,但是我肯定你也不知道”,这句话意味什么?这意味着 s (甲手中的数字) 不能表达为两个素数的和,否则的话,例如如果 s = 8 = 3 + 5,乙手中的数 p 就可能是 15,而 15 只能分解成 3*5,于是乙能断言这两个数是 (3,5), 因此甲没法断言 “......但是我肯定你也不知道”.

    因为 5 <= s <= 199,所以 s 总共有最多 195 种可能。我们将所有 s 构成的集合 S 分为两个子集 S1、S2,其中 S1 是 S 中所有能表示为两个素数之和的数的集合,S2 为剩余的数的集合。显然,从第一句对话,我们可以推断出,a+b=s 不能在 S1 中,只能在 S2 中。

    鉴于小于 200 的素数大约有 200/ln200 = 38 个素数,而且所有的偶数都能表示为两个素数的和,而且 (2 + 奇素数) 都是奇数,所以作为大体上的估算,S1 中大约有 95 + 37 = 132 个数,S2 中大约有 63 个数,所以从第一句对话中,我们就能去掉大约 2/3 的(a,b) 组合,可能的候选者大约只有 1500 种组合。当然这是一种大体上的估算,和真正的推理计算没啥关系。

    这里四海八荒猜测的组合(16,32)显然不满足第一句话的检测,因为甲的数是 48,因此乙的数就可能是 41*7=287。因此乙能够断言这两个数是 (7,41),因为 287 只有这么一种素数分解。

    再考察第二句话:“我本来是不知道这两个数的,你这么一说的话,那我就知道了”。
    乙手里的数字是(a,b) 的乘积 p = a*b。假设将 p 分解成素数的乘积,p = p1^n1 * p2^n2 *...* pk^nk,其中 p1,...,pk 是素数,n1,...,nk >= 1,例如 90 = 2 * 3^2 * 5,72 = 2^3 * 3^2, 等等。这时 p 所对应的 (a,b) 组合,若不论 a、b < 100 这个约束,就有 n = (n1+1)*(n2+1)*...*(nk+1) / 2 -1 种可能的组合,例如对 90 而言,它可能的组合有 (1+1)(2+1)(1+1)/2 -1 = 5 种可能:90 = 2*45=3*30=5*18=6*15=9*10。
    现在乙能根据甲的第一句话能推断出这两个数是什么,这意味着什么?这意味着总共 n 种 (a, b) 组合中,他能恰好排除 (n-1) 种可能。或者等价地说,p 对应的 n 个 a+b,恰好有 (n-1) 个属于集合 S1 中,有且只有 1 个属于 S2 中。
    我们看个具体的实例,p = 90,它能分解成 5 种可能的 a*b:
    p1):90 = 2*45,2+45=47,属于 S2 (因为们47 不能表示为两个素数的和);
    p2):90 = 3*30,3+30=33 = 2+31,属于 S1;
    p3):90 = 5*18,5+18=23,属于S2;
    p4):90 = 6*15,6+15=21=2+19,属于 S1;
    p5):90 = 9*10,9+10=19=2+17,属于 S1。
    显然,这里 90 不满足这个检测,因为乙的这个数所有可能的分解中,除去那些越界的,必须恰好有且仅有一种分解,其和在集合S2中,这里我们却有两个组合在 S2 中。

    我们再来看看四海八荒随后猜测的组合 (2,9)。这个组合能满足第一句话的检测,因为 2+9=11 不能表达为两个素数的和。咱们具体看看能否满足第二句话的检测。这时乙手中的数是 18. 而 18 有如下两种分解:
    p1):18 = 2×9,2+9=11 属于 S2;
    p2):18 = 3×6,3+6=9  属于 S1.
    因此 (2,9)能通过第二句话的检测,因为它的乘积的所有可能的因式分解中,有且只有一种,其和在 S2 中。

    这里眼尖一点的同学可能留意到了,90 有 5 钟分解,18 只有两种,显然分解的可能性越大,通过第二句话检测的可能性也就越小。

    再看另一可能的组合 (4,13)。因为 4+13=17 不能表达为两个素数的和,因此它能通过第一句话的检测。再考察第二句话。因为 p = 52 = 4*13 = 2*26,4 + 13 属于 S2,2+26 是偶数,属于 S1,所以它能满足第二步的检测。

    我们接下来考虑第三句话。
    第三句话是:“甲:那我也知道了”。注意甲手里的数字是 s = a+b,通常,s 能表达为多种 a + b,例如 8 = 2 + 6 = 3 + 5,两种;11 = 2+9=3+8=4+7=5+6,四种。一般,除去极端情形,s 不超过 100,s 能表示成 [ (s+1)/2] -2 种不同的 (a,b) 之和,这里 [x] 表示 x 的整数部分。若 s 超过 100,那么 s 就只能表示成总共 98 种表示 (考虑越界)。这句话的意思无非是说,甲看到手里的 s 后,对所有可能的总共 min ([ (s+1)/2] -2,[ (197-s)/2])  种可能的 (a、b),乙所对应的总共 min ([ (s+1)/2] -2,[ (197-s)/2]) 种可能的乘积 p,恰好存在一种组合使得乙能判断出 (a,b)。亦即在这么多不同的 p 中间,有且只有一个组合,满足第一步和第二步的检测。

    很明显,随着 s 的增加,min ([ (s+1)/2] -2,[ (197-s)/2]) 也在增加 (然后变小),要满足第三个检测 (亦即存在唯一一个组合使得乙能判断) 也越来越困难。因此如果不依赖程序、只依赖手工去寻找这个组合,那么先应该去从小 s 中寻找才能保证更高的机率。

    具体看 s = 17。从上面的例子我们可以看出,(4、13) 是满足前两步检测的。我们就以 s = 17 来看甲能否说“那我也知道了〃。我们有:
    s = 17 = 2+15=3+14=4+13=5+12=6+11=7+10=8+9 总共 7 种组合。
    情形1):p=30=2*15=3*10=5*6,S1:3+10,S2:2+15,5+6;乙不能判断;
    情形2):p=42=2*21=3*14=6*7,S1:6+7;S2:2+21,3+14;乙不能判断;
    情形3):p=52=2*26=4*13,根据上面的讨论,乙能判断;
    情形4):p=60=2*30=3*20=4*15=5*12=6*10,其中3*20、5*12都属于S2,所以乙不能判断;
    情形5):p=66=2*33=3*22=6*11,其中2*33、6*11都属于S2,所以乙不能判断;
    情形6):p=70=2*35=5*14=7*10,其中2*35、7*10 都属于S2,所以乙不能判断;
    情形7):p=72=2*36=3*24=4*18=6*12=8*9,其中3*24、8*9 都属于S2,所以乙不能判断。

    所以,对 s = 17,对所有可能的 7 种 a+b 组合,存在且唯一存在一种组合4+13,使得乙能判断,以及甲能判断。

    所以,答案之一是 (4,13)。至于这答案是否唯一,靠手工计算,很很烦了。不过即使不唯一,满足条件的答案估计也就那么几个,而且数字不会很大。

    我们再来看看组合(2,9),根据楼上的分析,(2,9)能通过前面两句话的检测。我们来看看它能否通过第三句话的检测。类似的,我们有:
    s=11=2+9=3+8=4+7=5+6, 总共四种可能的组合。逐一考察:
    情形1): p=18=2*9=3*6, 根据上面的讨论,乙能判断;
    情形2): p=24=2*12=3*8=4*6, S1: 2+12, 4+6; S2: 3+8. 乙能判断;
    情形3): 从略
    情形4): 从略
    为啥“从略”呢?因为无论是情形1 还是情形2,乙都能判断,因此甲就吃不准乙的数到底是哪种情形(说不定还可能是情形3&4),因此甲就没法断言“那我也知道了”。
    珠藏泽自媚,玉韫山含辉。
    博客:新浪博客 & 万维读者博客
  • TA的每日心情
    开心
    2025-1-7 04:54
  • 签到天数: 236 天

    [LV.7]常住居民III

    155

    主题

    6159

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥多彩人生心曲飞扬星星情怀七彩绚丽鹰傲苍穹飞龙在天大将风范共看流星风雨同行我心永远指尖上的流年花潮版主

    发表于 2020-10-24 23:27 来自手机 | 显示全部楼层
    学习了,
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-12-25 07:11
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    117

    主题

    2335

    回帖

    6344

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪春风拂面缤纷心情七彩绚丽心香一瓣紫色情节妙笔生花共看流星

     楼主| 发表于 2020-11-29 12:47 | 显示全部楼层
    res.zip (135.26 KB, 下载次数: 2)

    照上述思路编了个小程序,我已经编译好了,见附件。大家电脑里都自动装了 Java, 所以应该可以运行。有兴趣的同学可以试一试。
    0)下载附件,打开,将里面的文件解压到你电脑的某个目录,例如我解压到了
         c:\Temp\Temp5
        (其实只需将两个 *.class 文件保存到你的目录就可以了)
    1)文件说明:
       SumAndProductProblem.class & SumAndProductProblem$ResultPair.class  : 编译的运行文件
       SumAndProductProblem.java : 源文件,供参考
       demo.jpg : 显示怎么运行
    2)运行:打开电脑的 命令窗口  command prompt,将目录切换到你开始保存解压文件的目录 (l例如我的是 c:\temp\temp5)
          cd c:\temp\temp5
      然后键入以下命令,回车键:
          java SumAndProductProblem
    根据提示输入一个大于 4 的整数 N(例如 100,也就是一楼的情形),程序会找出所有不超过 100 的两张卡片的数是多少。



    珠藏泽自媚,玉韫山含辉。
    博客:新浪博客 & 万维读者博客
  • TA的每日心情
    慵懒
    2020-12-25 07:11
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    117

    主题

    2335

    回帖

    6344

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪春风拂面缤纷心情七彩绚丽心香一瓣紫色情节妙笔生花共看流星

     楼主| 发表于 2020-11-29 12:50 | 显示全部楼层
    如果 N 不超过 10000,程序很快能找出所有结果
    N=10 万,就明显需要一定的时间了
    N= 100 万,可能需要一天的时间 (和你的电脑配置有关)
    N= 1000 万,我就没试了,估计一周时间也不够
    珠藏泽自媚,玉韫山含辉。
    博客:新浪博客 & 万维读者博客
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 04:28 , Processed in 0.160751 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表