如果两个素数相差无几,两个素数被定义为孪生素数。例如,3和5是孪生素数,是29和31。
编写一个程序,查找第n对孪生素数(其中n来自STDIN),并在STDOUT上打印它们,用逗号和空格分隔。这是密码-高尔夫,所以最短的代码获胜。
样本输入:
3样本输出:
11, 13发布于 2014-06-16 14:31:09
using System.Linq;class P{static void Main(string[] args){var i=int.Parse(args[0]);int f=0,c=0;for(int j=1;;j+=2){var b=(Enumerable.Range(1,j).Count(x=>j%x==0)==2);if(f==0 && b){f=j;continue;}if(b){c++;if(c==i){System.Console.WriteLine(f+","+j);break;}j-=2;}f=0;}}}发布于 2014-06-16 15:47:23
require'mathn'
n=gets.to_i
a=1
(a+=2;a.prime?&&(a+2).prime?&&n-=1)while n>0
A2gt;<<"#{a}, #{a+2}"在线测试:http://ideone.com/B2wxnG
发布于 2014-06-17 17:33:44
蛮力CTE查找素数,窗口函数计数n,然后用连接查找孪生子。对于输出< 1,000,则在1秒钟内工作,对于输出< 10,000,则不到一分钟。
金(SQLFiddle 这里):
WITH x(i) AS(SELECT 99 UNION ALL SELECT i-2
FROM x WHERE i>3),z AS(SELECT RANK()OVER(ORDER BY x.i)n,x.i
FROM x x LEFT JOIN x y ON x.i%y.i=0 AND y.i NOT IN(x.i,1)
WHERE y.i IS NULL)SELECT LTRIM(a)+', '+LTRIM(b)FROM(SELECT RANK()
OVER(ORDER BY x.i)n,x.i a,y.i b FROM z x,z y WHERE x.n=y.n-1
AND x.i=y.i-2) o WHERE n=3
OPTION(MAXRECURSION 0)易读的:
WITH x(i) AS (
SELECT 99
UNION ALL
SELECT i-2
FROM x
WHERE i > 3
)
,z AS (
SELECT RANK()OVER(ORDER BY x.i)n,x.i
FROM x x
WHERE NOT EXISTS
(SELECT *
FROM x y
WHERE x.i%y.i = 0
AND y.i NOT IN (x.i,1)
)
)
SELECT LTRIM(a)+', '+LTRIM(b)
FROM (
SELECT RANK()OVER(ORDER BY x.i)n,x.i a, y.i b
FROM z x, z y
WHERE x.n = y.n+1
AND x.i = y.i+2
) o
WHERE n = 3
OPTION(MAXRECURSION 0)https://codegolf.stackexchange.com/questions/31822
复制相似问题