|
Problem 35
17 January 2003
The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
How many circular primes are there below one million?
问题35:环绕质数
一个质数,各位数字围成一个有向圆圈,按顺序,无论从哪个数字开始,都能组成一个质数,那这个质数就是环绕质数。比如197、971和719就是这样一组环绕质数
100以内的环绕质数已知的有:2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79 和97共13个
问100万以内这样的环绕质数有多少个?
1、建个100万之内的质数表:
CREATE TABLE PRIME_1M( PN NUMBER);
insert/*+ Append*/ into prime_1M WITH t AS (
SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= (1000000)/2-1-1
)
select pn from (
SELECT rn AS pn from t
MINUS
SELECT t1.rn * t2.rn FROM t t1, t t2
WHERE t1.rn <= t2.rn AND t1.rn < 1000 AND t1.rn * t2.rn <1000000
UNION
SELECT 2 FROM DUAL)
/
2、求解
with c1 as (select pn from prime_1m where pn>100 and pn=regexp_substr(pn, '[1379]*')), --包含024568的数肯定不可能是circular prime
l as (select rownum rn from dual connect by rownum<=6), --1M以内的质数,最长也就是6位了。除了自身外,最多还可能有5个不一样的circular prime
cc as (select pn, substr(pn,rn+1)||substr(pn,1,rn) cpn from c1, l where rn<=length(pn)), --求出一个prime的所有circular prime
cc2 as (select pn, min(cpn) mincpn, count(distinct cpn) cpncntd, count(*) cpncnt from cc group by pn) --求出一个质数对应的最小circular prime
select mincpn, sum(count(*))over() from cc2 group by mincpn having count(*)=min(cpncntd) -- 其实和 max(cpncnt) 的值一样,我只是担心在环绕过程中出现重复的数字,这会导致最后计算结果有误,不过后来琢磨了一下,这种现象不应该出现,如果出现,那这个数字一定不是质数
/
MINCPN SUM(COUNT(*))OVER()
---------- -------------------
113 42
1193 42
11939 42
193939 42
197 42
199 42
19937 42
199933 42
337 42
3779 42
10 rows selected.
这里只求出了100以上的,100以内的已经在题目中说过了
所以,最终结果是 42+13=55个环绕质数
[ 本帖最后由 lastwinner 于 2010-11-14 22:13 编辑 ] |
|