用SQL解決兩道有趣的題(二)
Oracle的SQL語句功能還是很強的,看到兩道比較有趣的題,用SQL來嘗試求解。
用SQL解決兩道有趣的題(一):http://yangtingkun.itpub.net/post/468/448940
第二個問題:
Gauss和Poincare在天堂相遇了,上帝說:你們都是人間最偉大的數學家,那我來出道題考考你們誰更聰明。我在左手寫一個大於1小於100的數,在右手同樣寫一個大於1小於100的數,然後把他們的和寫在Gauss手上,把積寫在Poincare手上,看看你們能不能猜出這兩個數字是幾。
Gauss看了手上的數字,說:“我不知道這兩個數字是幾,可我保證Poincare也不知道。”
Poincare看了手上的數字,說:“我原來的確不知道那兩個數字是幾,可我現在知道了。”
Gauss說:“那我也知道了。”
問題:那兩個數字是幾?
粗看上去似乎和剛才第一題很像,如果仔細研究就會發現二者的區別還是很大的,相比之下,這道題比第一題要難一些。
仍然是先給出SQL解,然後描述一下思路:
SQL> WITH T_NUM AS
2 (SELECT ROWNUM + 1 NUM FROM DUAL CONNECT BY LEVEL < 99)
3 SELECT A, B
4 FROM
5 (
6 SELECT
7 A,
8 B,
9 TOTAL,
10 MUL,
11 MUL_P,
12 COUNT(DECODE(MUL_P, 1, 1)) OVER(PARTITION BY TOTAL) VALUE
13 FROM
14 (
15 SELECT
16 A,
17 B,
18 TOTAL,
19 MUL,
20 COUNT(*) OVER (PARTITION BY TOTAL) TOTAL_P,
21 COUNT(*) OVER (PARTITION BY MUL) MUL_P
22 FROM
23 (
24 SELECT
25 A,
26 B,
27 TOTAL,
28 MUL,
29 MIN(MUL_P) OVER (PARTITION BY TOTAL) MUL_M
30 FROM
31 (
32 SELECT
33 A.NUM A,
34 B.NUM B,
35 A.NUM + B.NUM TOTAL,
36 A.NUM * B.NUM MUL,
37 COUNT(*) OVER (PARTITION BY A.NUM + B.NUM) TOTAL_P,
38 COUNT(*) OVER (PARTITION BY A.NUM * B.NUM) MUL_P
39 FROM T_NUM A, T_NUM B
40 WHERE A.NUM < B.NUM
41 )
42 )
43 WHERE MUL_M != 1
44 )
45 )
46 WHERE MUL_P = 1
47 AND VALUE = 1;
A B
---------- ----------
4 13
下面簡單描述一下思路:
WITH語句就是構造一張基礎資料表。
最內層的迴圈構造兩個數的笛卡兒積,列出所有的可能,不過對於我們來說,A取1,B取2和A取2,B取1沒有區別,因此加上限制條件A > B。迴圈中的分析函式用來計算A、B兩個數的和相同的個數以及A、B兩個數的積相同的個數。
下面到了這道題和第一題的區別之處。Gauss不但自己不知道,還可以確認Poincare也不知道。這說明A、B兩個數構成Gauss手裡的和TATOL不但不是唯一的,而且所有能構成這個TOTAL的A和B的積MUL都不是唯一的。這就是第二層巢狀的含義。
到了第三層,過濾掉上面那些不符合條件的A和B之後。要解決的問題就是Poincare知道A和B的答案後,Gauss也知道了。
這說明對於TOTAL這個值,所有A和B的組合中有一個且只有一個組合它們的乘積是唯一確定的。這是透過第四層巢狀中那個COUNT(DECODE) OVER實現的。
最後過濾乘積唯一,且對於相同TOTAL的所有A和B組合中有且僅有一個乘積唯一確定的A、B組合。
如果還是不明白,可以將這個巢狀一層層執行,觀察每一步的執行結果,有助於理解每一步實現的目的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-83501/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 兩款工具解決SQL Server遷移問題DJSQLServer
- 一道很有趣的拓撲題
- 分享一道有趣的 Leetcode 題目LeetCode
- 一道有趣的golang排錯題Golang
- 用SQL解決有向圖問題(轉)SQL
- 有趣的ES:解決es返回結果數量限制問題
- sql多參問題解決SQL
- SQL經典練習題48道之二(11-19)SQL
- 用程式消除一道概率題的二義性
- 一道小學數學題的解決
- 【SpringMVC】解決跨域問題的兩種方式SpringMVC跨域
- 什麼是 Flink SQL 解決不了的問題?SQL
- 雜題隨筆 10.31 兩道LIS相關的題
- 01分數規劃的兩道例題
- 價值 100 RMB 的一道 SQL 題SQL
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 教你兩招解決EOS CPU短缺問題
- 【OracleEBS】 訂單暫掛問題sql解決OracleSQL
- Spark SQL中出現 CROSS JOIN 問題解決SparkSQLROS
- 從兩道面試題說起面試題
- 使用 AI 解決一道演算法題AI演算法
- Go的http庫處理multipart的兩個問題解決GoHTTP
- 每日"兩"題 題解
- 2024/9/10+11 分塊雜題三道 + 縫合題兩道
- SQL隱碼攻擊問題以及解決方法SQL
- 微服務閘道器 gateway 跨域問題解決微服務Gateway跨域
- 這15道MySQL面試題,解決了90%的面試官MySql面試題
- (xml中sql語句為紅)解決No data sources are configured to run this SQL and provide advanced的問題XMLSQLIDE
- 高手過招:用SQL解決環環相扣的刑偵推理問題(羅海雄版本)SQL
- 那些有趣/用的 Python 庫Python
- 解決react useEffect中的內容被執行兩次的問題React
- 用STAR模式來解決問題模式
- 二進位制方式解決 power 問題
- ES系列二之常見問題解決
- 兩行命令解決 Windows 下 Homestead 執行緩慢的問題Windows
- HTML中兩個tabs導航衝突問題的解決方法HTML
- 解決 Delegate IDE build/run actions to Maven 編譯兩次的問題IDEUIMaven編譯
- 教你用Java位元組碼做點有趣的事(二)之ASMJavaASM
- 【MISC】一道假的二維碼題目學習zxing庫[python解讀二維碼]Python