從2到5中選兩個數,第一個數較大,將兩數之和告訴甲,兩數之差告訴乙,兩我的根據本身手上的數都算不出來答案,求這兩個數分別是多少?java
A. 4,3
B. 5,3
C. 5,2
D. 4,2git
看到這題,第一個想法就是排除法來解了,那麼,咱們一個一個答案來分析:ui
上面的題目是否是挺簡單的,那麼來拓展一下,看一道相似的經典題目【鬼谷子問徒】spa
孫臏,龐涓都是鬼谷子的徒弟。一天鬼谷子出了這道題目:
他從 2 到 99 中選出兩個不一樣的整數,把積告訴孫臏,把和告訴龐涓;
龐涓說:我雖然不能肯定這兩個數是什麼,可是我確定你也不知道這兩個數是什麼。
孫臏說:我原本的確不知道,可是聽你這麼一說,我如今可以肯定這兩個數字了。
龐涓說:既然你這麼說,我如今也知道這兩個數字是什麼了。
請問這兩個數字是什麼?爲何?code
這道題目必定要看,用上面的方法解決太麻煩了吧,先直接寫個窮舉來看下答案吧it
3package com.liangdianshui; /** * <p>鬼谷子問徒[經典] 孫臏,龐涓都是鬼谷子的徒弟。一天鬼谷子出了這道題目: 他從2到99中選出兩個不一樣的整數,把積告訴孫臏,把和告訴龐涓; * 龐涓說:我雖然不能肯定這兩個數是什麼,可是我確定你也不知道這兩個數是什麼。 * 孫臏說:我原本的確不知道,可是聽你這麼一說,我如今可以肯定這兩個數字了。 * 龐涓說:既然你這麼說,我如今也知道這兩個數字是什麼了。 請問這兩個數字是什麼?爲何? * </p> * * @author Administrator * */ public class DigitalProblem { public static void main(String[] args) { for (int n = 6; n < 200; ++n) // 窮舉和的可能,最大不超過200 { // 其和能同時知足條件1和3者即爲結果 if (p1(n) && p3(n)) { // 找出對應解 for (int t = 2; t * 2 < n; ++t) { if (p2(t * (n - t))) // 分拆結果符合條件2就輸出 System.out.println("(" + t + "," + (n - t) + ")"); } } } } /** * 是不是惟一分解 * * @param n * @param nMax * 最大值爲100 * @return */ public static boolean isOnlySolve(int n, int nMax) { int nRet = 0; // 記錄知足本條件數 for (int i = 2; i * i < n; ++i) { if (n % i == 0 && n / i < nMax) if (++nRet > 1) { return false; } } return true; } /** * sum的任意和的分拆之積不可能有惟一分解,不然對方可能猜出 * <p> * 我雖然不能肯定這兩個數是什麼,可是我確定你也不知道這兩個數是什麼。 * </p> * * @param sum * @return */ public static boolean p1(int sum) { if (sum < 6) return false; for (int t = (sum - 1) / 2; t > 1; --t) { if (isOnlySolve(t * (sum - t), 100)) return false; } return true; } /** * 只有一種積的分拆知足 p1 * <p> * 我原本的確不知道,可是聽你這麼一說,我如今可以肯定這兩個數字了 * </p> * * @param times2 * @return */ public static boolean p2(int times2) { int nRet = 0; // 記錄知足本條件數 for (int nd = 2; nd * nd < times2; ++nd) { if (times2 % nd == 0 && p1(nd + times2 / nd)) if (++nRet > 1) return false; } return true; } /** * 只有一種和的分拆知足 p2 * <p> * 既然你這麼說,我如今也知道這兩個數字是什麼了 * </p> * * @param sum * @return */ public static boolean p3(int sum) { int nRet = 0; // 記錄知足本條件數 for (int t = (sum - 1) / 2; t > 1; --t) { if (p2(t * (sum - t))) if (++nRet > 1) return false; } return true; } }
運行的結果爲:class