PHP网站建设的基本流程,中国施工企业协会官网,中山做网站好的公司,网页制作与网站建设试卷及答案首先声明一点#xff0c;文章内容从itpub论坛上看到的#xff0c;原文链接 http://www.itpub.net/thread-1849398-1-1.html#xff0c;本文主要是记录下笔记#xff0c;原文中有更详细的分析。使用sql求质素没什么实用价值#xff0c;重要的是思路。(一)最简单的方法思路文章内容从itpub论坛上看到的原文链接 http://www.itpub.net/thread-1849398-1-1.html本文主要是记录下笔记原文中有更详细的分析。使用sql求质素没什么实用价值重要的是思路。(一)最简单的方法思路将2和所有大于等于3小于XX的奇数取出来做一中间结果集t。然后逐一校验t中的每个N是否是质数。如果发现一个数字N不能被其他所有数字整除——当然这些数字要小于等于SQRT(N)那么N就是质数with t as(select 2 n from dual union select rownum*21 from dual connect by rownum(10000-2)/2)select count(*) from t a where not exists (select null from t b where b.nsqrt(a.n) and mod(a.n, b.n)0)最直接的方法可惜速度最慢。(二)筛选法思路将从2到XX的数都列出来作为一个全集然后减去所有的合数即可得到素数集合WITH t AS (SELECT ROWNUM1 rn FROM DUAL CONNECT BY ROWNUM 10000-1)SELECT COUNT(*)FROM (SELECT rnfrom tMINUSSELECT t1.rn * t2.rn--42*2 2*3 93*3 3*4 164*4 4*5FROM t t1, t t2WHERE t1.rn t2.rnAND t1.rn (SELECT SQRT(10000) FROM DUAL))(三)改进的筛选法思路除了2之外的偶数可以从全集和合数集中排除WITH t AS (--2-10000/2SELECT ROWNUM1 rn FROM DUAL CONNECT BY ROWNUM 10000/2-1),t_odd AS (--奇数SELECT 2*ROWNUM1 rn FROM DUAL CONNECT BY ROWNUM 10000/2-1)SELECT COUNT(*) 1--2FROM (SELECT rnfrom t_oddMINUSSELECT t1.rn * t2.rnFROM t t1, t t2WHERE t1.rn t2.rnAND t1.rn (SELECT SQRT(10000) FROM DUAL)AND t1.rn * t2.rn 10000)另一种写法排除偶数WITH t_odd AS (SELECT 2*ROWNUM1 rn FROM DUAL CONNECT BY ROWNUM 10000/2-1)SELECT COUNT(*) 1FROM (SELECT rnfrom t_oddMINUSSELECT t1.rn * t2.rn --93*3 3*5 255*5 5*7 497*7FROM t_odd t1, t_odd t2WHERE t1.rn t2.rnAND t1.rn (SELECT SQRT(10000) FROM DUAL)AND t1.rn * t2.rn 10000)(四)逆向existswith t as(select 2 n from dual union select rownum*21 from dual connect by rownum(10000-2)/2), z as (select * from t minusselect * from t a where exists (select null from t b where b.nsqrt(a.n) and mod(a.n, b.n)0))select count(*) from z或者with t as(select rownum*21 n from dual connect by rownum(10000-2)/2union select 3 from dual --F5执行计划 走MERGE JOIN),z as (select * from t minusselect * from t a where exists (select null from t b where b.nsqrt(a.n) and mod(a.n, b.n)0))select count(*)1 from z加了union select 3 from dual 之后,执行计划走MERGE JOIN这一点还没想明白欢迎指教。(五)提前剔除奇数WITH t0 AS (SELECT 2*ROWNUM1 rn FROM DUAL CONNECT BY ROWNUM (10000)/2-1),t as(SELECT rn from t0 where mod(rn,3)0 and mod(rn,5)0 and mod(rn,7)0 and mod(rn,11)0 and mod(rn,13)0 and mod(rn,17)0 and mod(rn,19)0)SELECT COUNT(*) 1 7 --235711131719FROM (SELECT rnfrom tMINUSSELECT t1.rn * t2.rnFROM t t1, t t2WHERE t1.rn t2.rnAND t1.rn BETWEEN 9 AND (SELECT SQRT(10000) FROM DUAL)AND t1.rn * t2.rn 10000)其实后面的大部分写法都是采用提前筛选掉不合格的数字来减少源数据大小达到加快查询速度。全文完。