用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解決兩道有趣的題(一)SQL
- 高手幫忙解決兩道JAVA題,跪謝!!Java
- 一道有趣的golang排錯題Golang
- 一道很有趣的拓撲題
- 兩款工具解決SQL Server遷移問題DJSQLServer
- 用SQL解決有向圖問題SQL
- 黑白兩道進階二
- 分享一道有趣的 Leetcode 題目LeetCode
- 今天解決的兩個問題
- 用SQL解決有向圖問題(轉)SQL
- 兩道簡單的oracle題目Oracle
- 有趣的ES:解決es返回結果數量限制問題
- 用程式消除一道概率題的二義性
- 一道小學數學題的解決
- 一道SQL題SQL
- 一個有趣的sqlSQL
- 兩臺SQL Server資料同步解決方案SQLServer
- SQL經典練習題48道之二(11-19)SQL
- 從兩道面試題說起面試題
- 一道sql面試題的解答SQL面試題
- sql多參問題解決SQL
- 一道面試題:大家幫忙解決面試題
- 有趣的SQL-搜尋前三名問題SQL
- Josephus問題解決方法二
- 兩臺SQL Server資料同步解決方案(轉)SQLServer
- 用兩個鎖解決單例模式的同步單例模式
- 有趣的CSS題目(5): 單行居中,兩行居左,超過兩行省略CSS
- 【meil】MS SQL用ROWCOUNT解決TOP子句不支援變數的問題SQL變數
- 這15道MySQL面試題,解決了90%的面試官MySql面試題
- 一道sql面試題的求解方法SQL面試題
- 【SpringMVC】解決跨域問題的兩種方式SpringMVC跨域
- 關於敏捷開發的兩道選擇題敏捷
- 教你兩招解決EOS CPU短缺問題
- 解決SQL Server資料庫佔用記憶體過多的問題SQLServer資料庫記憶體
- 有趣的DBA面試題面試題
- 一道小學題的sql實現~~~SQL
- 每日"兩"題 題解
- 解決兩個難懂的安全性問題(轉)