|
把newkid21楼加上and t2.rn<=:n/31
和use merge提示,不可思议的结果 看来mod的时间复杂度没比乘法差多少
SQL> WITH t0 AS (
2 SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (:n)/2-1-1
3 ),
4 t as(SELECT rn from t0
5 where mod(rn,3)<>0
6 and mod(rn,5)<>0
7 and mod(rn,7)<>0
8 and mod(rn,11)<>0
9 and mod(rn,13)<>0
10 and mod(rn,17)<>0
11 and mod(rn,19)<>0
12 and mod(rn,23)<>0
13 and mod(rn,29)<>0
14 )
15 SELECT COUNT(*)+10 --2,3,5,7,11,13,17,19,23,29
16 FROM (SELECT rn from t
17 MINUS
18 SELECT /*+ USE_MERGE (t1 t2) */ t1.rn * t2.rn
19 FROM t t1, t t2
20 WHERE t1.rn <= t2.rn
21 AND t1.rn BETWEEN 31 AND (SELECT SQRT(:n) FROM DUAL)
22 AND t1.rn * t2.rn <:n and t2.rn<=:n/31
23 )
24 /
COUNT(*)+10--2,3,5,7,11,13,17,19,23,29
--------------------------------------
148933
已用时间: 00: 00: 03.71 |
|