我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

使用SQL判断一个数是否质数

上一篇 / 下一篇  2008-01-10 23:40:00 / 个人分类:ORACLE

前两天用SQL计算一个数以内的所有质数,这里补一篇判断一个数是否是质数的SQL实现。

SQL计算100以内的质数:http://yangtingkun.itpub.net/post/468/450278

 

 

这个SQL的实现方法前面那个SQL很类似:

SQL> UNDEF NUM
5lSi{*P2][H\(_5D0SQL> WITHITPUB个人空间vC2E@e q@Q^
  2  T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)ITPUB个人空间:I]? xToV
  3  SELECT &NUMITPUB个人空间0YEJk+`w&Mfq
  4   || DECODEITPUB个人空间%zN#H%z1S2Sx
  5    (ITPUB个人空间Q"Q"l(`#['U4N1tM_
  6     (ITPUB个人空间(G#aZ Ft7a
  7      SELECT &NUM FROM DUALITPUB个人空间$r9u.N;z7fA
  8      MINUS
I'z*x8US'Ec!C0  9      SELECT A.RN * B.RN FROM T A, T BITPUB个人空间K Xt%J T2V@
 10      WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
t3Clz |Ht0 11      AND B.RN >= ROUND(POWER(&NUM, 0.5))ITPUB个人空间Gm:jS#l aW _
 12     ),ITPUB个人空间uh/p/T \~3~
 13     NULL,ITPUB个人空间K*uK?4bol
 14     '
'
6LD+Y~9V C0 15    )
O0o3xu^Tg0 16   || '
是质数'
xY6Tsj1HsH6^:d X0 17  FROM DUAL;
!|1az;u9}0
输入num的值:  23
v;z]3z~bX0
原值    2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
a [;V,F&U ad6sy0
新值    2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 23/2)
s5iZQ wjO0
原值    3: SELECT &NUM
{+Z&KO:L1X#f6R0
新值    3: SELECT 23
/jkMv$Kj3fN0
原值    7:     SELECT &NUM FROM DUAL
u+K?2fk9AX3K;oX1x:B0
新值    7:     SELECT 23 FROM DUAL
,P!t|&r;My0
原值   10:     WHERE A.RN <= ROUND(POWER(&NUM, 0.5))
6t-lSXZx7N0
新值   10:     WHERE A.RN <= ROUND(POWER(23, 0.5))
OJ ?r U#~(w9i0
原值   11:     AND B.RN >= ROUND(POWER(&NUM, 0.5))
3Jhu0m:YW3L)Z1Y0
新值   11:     AND B.RN >= ROUND(POWER(23, 0.5))

23||DECODEITPUB个人空间F!AEw^ Y5eCZ#c
----------ITPUB个人空间F(F w Bv/Qhj(t
23
是质数

SQL> UNDEF NUMITPUB个人空间G*E?J6D kL0P `
SQL> WITH
C~bh9Npg0  2  T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
4Wi[%@+Zho{`.d0  3  SELECT &NUMITPUB个人空间V2o-L0{ vqV
  4   || DECODE
A-v!w%oG6|\2r0  5    (ITPUB个人空间sRqDx B.YFX
  6     (ITPUB个人空间;?t u []k,Xy
  7      SELECT &NUM FROM DUAL
r f r&hD rX3D0  8      MINUSITPUB个人空间&FbO-Btf9Y
  9      SELECT A.RN * B.RN FROM T A, T B
L[S]F*I0 10      WHERE A.RN <= ROUND(POWER(&NUM, 0.5))ITPUB个人空间 T#F9Ut*uD*WZ}F
 11      AND B.RN >= ROUND(POWER(&NUM, 0.5))ITPUB个人空间 ~7RGvMW(iL|1N
 12     ),
/d'X#s6ym%Q+w(AZ0 13     NULL,ITPUB个人空间 wC+TM*U
 14     '
'ITPUB个人空间bQaSf8CB4x*K1R
 15    )ITPUB个人空间2odJ&A.Xv:uL
 16   || '
是质数'
%a+z%H;k4kz+Zx0 17  FROM DUAL;
"qA0Hm9iy5}0
输入num的值:  25ITPUB个人空间o|^k$R.}
原值    2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)ITPUB个人空间&wA)F P}~ D{!_$C
新值    2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 25/2)
0eXG%|&g1e&Hr0
原值    3: SELECT &NUM
t4Yt},cr9aH3F~yd0
新值    3: SELECT 25ITPUB个人空间OBPQpD,L \xi
原值    7:     SELECT &NUM FROM DUALITPUB个人空间T$F'uy%^.^
新值    7:     SELECT 25 FROM DUAL
a b~(zH:JwcPu-O0
原值   10:     WHERE A.RN <= ROUND(POWER(&NUM, 0.5))ITPUB个人空间g/@A XA\#w7?
新值   10:     WHERE A.RN <= ROUND(POWER(25, 0.5))ITPUB个人空间G4P[s `,W'm&k
原值   11:     AND B.RN >= ROUND(POWER(&NUM, 0.5))
{n8E2Yj+S(adXOA0
新值   11:     AND B.RN >= ROUND(POWER(25, 0.5))

25||DECODE
)\4UQwo.ny-k0----------
6N&Rk8J-CnZ v025
不是质数

需要注意一点,对于开方结果的四舍五入是很必要的,否则可能会得到错误的结果:

SQL> UNDEF NUM
(oH \az;T0SQL> WITHITPUB个人空间*|7Z F&Q1x e.TI
  2  T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
ex idk2P:?JB s7X'vB0  3  SELECT &NUMITPUB个人空间L6d#\H%sN[%[
  4   || DECODEITPUB个人空间ub ?"M`%`0K
  5    (ITPUB个人空间*B8A#_[2E
  6     (
.T"f$mg t7h'klTG0  7      SELECT &NUM FROM DUAL
RnJ.} dBZ-a0  8      MINUS
9j [${'r d5j hco w7m0  9      SELECT A.RN * B.RN FROM T A, T BITPUB个人空间|Is\%j:]7N
 10      WHERE A.RN <= POWER(&NUM, 0.5)
{] O d1` w(|0 11      AND B.RN >= POWER(&NUM, 0.5)ITPUB个人空间2T(GyB,^.rnBn?8{
 12     ),ITPUB个人空间)I+M,jNJ ?
 13     NULL,ITPUB个人空间({!i/kr k"`
 14     '
'ITPUB个人空间Z$@2Ho.R K5`L
 15    )ITPUB个人空间lPVl;gZos$G
 16   || '
是质数'
k!eC"dN*O'b0 17  FROM DUAL;
#M/D;R'G9Aw0
输入num的值:  49ITPUB个人空间nX4tf3@c*f^
原值    2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= &&NUM/2)
1e hb$C!B&j0
新值    2: T AS (SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= 49/2)ITPUB个人空间3\zCn#qv"?7K?9k
原值    3: SELECT &NUM
(LV'A'IR,XH0
新值    3: SELECT 49
Q.k*L Ma3Q:u)~D0
原值    7:     SELECT &NUM FROM DUAL
HKS2pO;wk(i `0
新值    7:     SELECT 49 FROM DUAL
I+m8Upfi)[OD0
原值   10:     WHERE A.RN <= POWER(&NUM, 0.5)
UT9Bu RPU4f]0
新值   10:     WHERE A.RN <= POWER(49, 0.5)
Re(e e?1y)B1Sp%]0
原值   11:     AND B.RN >= POWER(&NUM, 0.5)
5nS'G8T \:QmYL*w/{0
新值   11:     AND B.RN >= POWER(49, 0.5)

49||DECODEITPUB个人空间 W @C+@)aq2Q,Q
----------ITPUB个人空间j vSk/u1w9Y
49
是质数

导致这个问题的原因就是OraclePOWER函数计算精度:

SQL> SELECT TO_CHAR(POWER(49, 0.5)) FROM DUAL;

TO_CHAR(POWER(49,0.5))
#E-B9S Zd9k2I/W0----------------------------------------ITPUB个人空间#C;V!} qZU+n@
7.00000000000000000000000000000000000003

这个SQL只适用于大于2的整数。SQL本身还可以进行部分优化,这里就不描述了。

 


TAG:

oracle_8i 引用 删除 oracle_8i   /   2008-01-27 17:28:10
hao!
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar