使用SQL判斷一個數是否質數
前兩天用SQL計算一個數以內的所有質數,這裡補一篇判斷一個數是否是質數的SQL實現。
用SQL計算100以內的質數:http://yangtingkun.itpub.net/post/468/450278
這個SQL的實現方法前面那個SQL很類似:
SQL> UNDEF NUM
SQL> WITH
2 T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
3 SELECT &NUM
4 || DECODE
5 (
6 (
7 SELECT &NUM FROM DUAL
8 MINUS
9 SELECT A.RN * B.RN FROM T A, T B
10 WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
11 AND B.RN >= ROUND(POWER(&NUM, 0.5))
12 ),
13 NULL,
14 '不'
15 )
16 || '是質數'
17 FROM DUAL;
輸入 num 的值: 23
原值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
新值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 23/2)
原值 3: SELECT &NUM
新值 3: SELECT 23
原值 7: SELECT &NUM FROM DUAL
新值 7: SELECT 23 FROM DUAL
原值 10: WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
新值 10: WHERE A.RN <= ROUND(POWER(23, 0.5))
原值 11: AND B.RN >= ROUND(POWER(&NUM, 0.5))
新值 11: AND B.RN >= ROUND(POWER(23, 0.5))
23||DECODE
----------
23是質數
SQL> UNDEF NUM
SQL> WITH
2 T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
3 SELECT &NUM
4 || DECODE
5 (
6 (
7 SELECT &NUM FROM DUAL
8 MINUS
9 SELECT A.RN * B.RN FROM T A, T B
10 WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
11 AND B.RN >= ROUND(POWER(&NUM, 0.5))
12 ),
13 NULL,
14 '不'
15 )
16 || '是質數'
17 FROM DUAL;
輸入 num 的值: 25
原值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
新值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 25/2)
原值 3: SELECT &NUM
新值 3: SELECT 25
原值 7: SELECT &NUM FROM DUAL
新值 7: SELECT 25 FROM DUAL
原值 10: WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
新值 10: WHERE A.RN <= ROUND(POWER(25, 0.5))
原值 11: AND B.RN >= ROUND(POWER(&NUM, 0.5))
新值 11: AND B.RN >= ROUND(POWER(25, 0.5))
25||DECODE
----------
25不是質數
需要注意一點,對於開方結果的四捨五入是很必要的,否則可能會得到錯誤的結果:
SQL> UNDEF NUM
SQL> WITH
2 T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
3 SELECT &NUM
4 || DECODE
5 (
6 (
7 SELECT &NUM FROM DUAL
8 MINUS
9 SELECT A.RN * B.RN FROM T A, T B
10 WHERE A.RN <= POWER(&NUM, 0.5)
11 AND B.RN >= POWER(&NUM, 0.5)
12 ),
13 NULL,
14 '不'
15 )
16 || '是質數'
17 FROM DUAL;
輸入 num 的值: 49
原值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
新值 2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 49/2)
原值 3: SELECT &NUM
新值 3: SELECT 49
原值 7: SELECT &NUM FROM DUAL
新值 7: SELECT 49 FROM DUAL
原值 10: WHERE A.RN <= POWER(&NUM, 0.5)
新值 10: WHERE A.RN <= POWER(49, 0.5)
原值 11: AND B.RN >= POWER(&NUM, 0.5)
新值 11: AND B.RN >= POWER(49, 0.5)
49||DECODE
----------
49是質數
導致這個問題的原因就是Oracle的POWER函式計算精度:
SQL> SELECT TO_CHAR(POWER(49, 0.5)) FROM DUAL;
TO_CHAR(POWER(49,0.5))
----------------------------------------
7.00000000000000000000000000000000000003
這個SQL只適用於大於2的整數。SQL本身還可以進行部分最佳化,這裡就不描述了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-134196/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 判斷一個數是否為質數(程式碼)
- 【質數判斷】給定兩個數,判斷這兩個數是否互質?
- JavaScript判斷數字是否是質數JavaScript
- javascript判斷一個變數是否是數字JavaScript變數
- Java判斷一個整數是否為奇數Java
- javascript判斷一個變數是否存在JavaScript變數
- js如何判斷一個變數是否是一個數字JS變數
- python如何判斷一個數是否是整數Python
- javascript如何判斷一個變數是否是整數JavaScript變數
- js判斷一個變數是否為空JS變數
- javascript如何判斷一個變數是否宣告JavaScript變數
- js如何判斷一個變數是否具有值JS變數
- js如何判斷一個變數是否是undefinedJS變數Undefined
- javascript如何判斷一個變數是否是undefinedJavaScript變數Undefined
- js如何判斷一個變數是否有值JS變數
- Python:判斷一個正整數是否為迴文數Python
- 質數判斷、質因子分解、質數篩
- JavaScript判斷兩個變數是否相等JavaScript變數
- js 判斷兩個變數是否相等JS變數
- js如何判斷一個變數值是否為undefinedJS變數Undefined
- js如何判斷一個引數是否是陣列JS陣列
- js判斷一個變數是否為字串型別JS變數字串型別
- nginx判斷路徑是否含有某個引數做判斷Nginx
- C#判斷一個字串是否是數字或者含有某個數字C#字串
- 每日codewars題之判斷一個數是否是水仙花數
- js如何判斷一個變數是否宣告並賦值JS變數賦值
- 在Oracle中,如何判斷一個字串是否為數字?Oracle字串
- SQL 判斷欄位是否以數字開頭或者包含數字SQL
- js判斷引數是否為非數字JS
- 如何判斷一個字串是否為純數字的問題,當然也可以判斷一個字串是否為純字母字串
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- 【c語言】判斷一個數是奇偶數C語言
- js之普通/高效判斷質數JS
- Python 判斷質數的另一種方法Python
- JavaScript 判斷變數是否是函式JavaScript變數函式
- postgresql判斷是否為數字的方法SQL
- php中判斷變數是否為空PHP變數
- linux 中如何判斷變數是否為數值Linux變數