Tìm cặp số nguyên tố thứ hai


26

Hai số nguyên tố được định nghĩa là số nguyên tố sinh đôi nếu chúng khác nhau hai. Ví dụ, 3 và 5 là số nguyên tố sinh đôi như 29 và 31.

Viết chương trình tìm cặp số nguyên tố sinh đôi thứ n (trong đó n đến từ STDIN) và in chúng trên STDOUT, cách nhau bằng dấu phẩy và dấu cách. Đây là môn đánh gôn, vì vậy đoạn mã ngắn nhất sẽ thắng.

Đầu vào mẫu:

3

Đầu ra mẫu:

11, 13

5
Đợi ... vì vậy người dùng sẽ nhập cặp số nguyên tố thứ n và bạn muốn chúng tôi xuất nó? Vì vậy, chỉ cần phản hồi lại những gì người dùng nhập? ;-)
Iszi

Hmm ... Từ ngữ đó hơi khó xử! : P
Jwosty

Câu trả lời:


11

Haskell 118

main=putStrLn.(!!)[show n++", "++show(n+2)|n<-[2..],all((>0).rem n)[2..n-1],all((>0).rem(n+2))[2..n]].(+)(-1)=<<readLn

Brute-force tất cả các số nguyên tố sinh đôi và in cặp thứ n .


5
Đẹp quá Bằng cách tách biệt chức năng lọc và sử dụng interactthay vì putStrLnbạn có thể đi xa hơn và đưa chức năng này xuống 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
Flonk

10

CJam, 29 26 byte

Y4]{{:)_{mp}/&!}g}q~*", "*

Hãy thử trực tuyến.

Ví dụ

$ for i in {1..10}; do cjam twin-primes.cjam <<< $i; echo; done
3, 5
5, 7
11, 13
17, 19
29, 31
41, 43
59, 61
71, 73
101, 103
107, 109

Làm thế nào nó hoạt động

Y4]        " Push [ 2 4 ].                                                            ";
{          "                                                                          ";
  {        "                                                                          ";
    :)     " Increment each integer in the array.                                     ";
    _      " Duplicate the array.                                                     ";
    {mp}/  " For each integer in the array, push 1 if it's prime and 0 otherwise.     ";
    &!     " Compute the logical NOT of the bitwise AND of the two previous integers. "; 
  }g       " If the result is non-zero, repeat the loop.                              ";
}q~*       " Do the above “N” times, where “N” is the integer read from STDIN.        ";
", "       " Join the array by comma and space.                                       ";

9

Perl, 101 87

87 ký tự, xây dựng trên nhận xét của aschepler

$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11t"=~$r||--$n||die"$s, ",$s+2,$/while++$s

101 ký tự, câu trả lời trước đó

$n=pop;$r=qr/^1$|^(11+?)\1+$/;(1x$s)!~$r&&(1x($s+2))!~$r&&++$i==$n&&say($s,", ",$s+2)&&exit while++$s

Sử dụng:

$ perl ./twin_primes.pl 10
107, 109

Giải trình

$n = pop;                 # Pulls twin prime pair counter from @ARGV
$r = qr/^1$|^(11+?)\1+$/; # The money line - a regex that verifies
                          # if a string of 1's has non-prime length

while ( ++$s ) {          # Loop over integers

                          # '&&' short-circuits
    (1 x  $s    ) !~ $r   # Negated regex match evaluates to true if $s is prime
 && (1 x ($s+2) ) !~ $r   # Same for $s + 2
 &&          ++$i == $n   # Counter to control which pair to print
 && say( $s, ", ", $s+2 ) # Print the line
 && exit                  # Terminate program
}

Hoạt động của regex không nguyên thủy được giải thích trong câu hỏi SO này .


..cái gì thế này?
xem

@TheRare: Nó sử dụng một biểu thức chính quy để kiểm tra tính nguyên thủy của một số.
Zaid

1
Bạn chỉ cần thổi tâm trí của tôi. Có +1.
xem

@TheRare: Tôi đã thêm một lời giải thích cho lý do tại sao điều này hoạt động. Tôi chắc chắn vẫn có chỗ cho sự cải thiện :)
Zaid

2
Khá nhiều những gì tôi sẽ làm. Có một vài nhân vật bị cạo:$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
aschepler

8

C: 113

n,c,l;main(i){for(scanf("%d",&n),l=2;n;l=c==i?n-=i==l+2,i:l,i+=2)for(c=2;c<i&&i%c++;);printf("%d, %d\n",l-2,l);}

Chạy mẫu:

$ for i in $(seq 1 10); do echo $i | ./twinprimes; done
3, 5
5, 7
11, 13
17, 19
29, 31
41, 43
59, 61
71, 73
101, 103
107, 109

Cảm ơn sự giúp đỡ từ Dennis, bebe và Alchymist.


Bạn có thể lưu một vài byte bằng cách sử dụng scanfthay vì đối số dòng lệnh. Ngoài ra, o=0là không cần thiết, vì olà toàn cầu.
Dennis

maincó thể giữ một biến int mặc định, tăng dần cigiữa các phép gán và câu lệnh có thể rút ngắn mã, phép gán lcó thể được đưa trở lại khối thứ ba cho vòng lặp thứ nhất để bạn không cần phải niềng răng và chỉ sử dụng một ký tự phân cách trong printf làm cho nó nhỏ gọn hơn
bebe

Cảm ơn, bebe! Tôi nhận thấy rằng tôi cũng đã có c<=i-1, đó chỉ là ngớ ngẩn.
millinon

Tôi không thấy cách cạo một byte bằng cách tăng itrong lbiểu thức gán, vì giá trị (mới) iđược sử dụng để giảm dần n. Bất cứ lời khuyên?
millinon

nếu tôi nhớ chính xác, có một nơi bạn có thể tăng i, nhưng tôi tin rằng trình biên dịch phụ thuộc vào nó :(
bebe

6

CJam - 26

1e4,{mp},_2f-&qi(=_2+", "\

Nó hoạt động cho các số nguyên tố nhỏ hơn 10000; bạn có thể thay thế 4bằng số mũ cao hơn cho số lớn hơn (có thể lên tới 10 20 ), nhưng chương trình sẽ chậm hơn và sẽ sử dụng nhiều bộ nhớ hơn.

Dùng thử tại http://cjam.aditsu.net/

Giải trình:

1e4,tạo mảng [0 1 2 ... 9999]
{mp},chỉ chọn các số nguyên tố
_2f-sao chép mảng và trừ 2 từ mỗi mục
&giao với hai mảng, do đó tìm các số nguyên tố thấp hơn từ mỗi cặp nguyên tố sinh đôi
qiđọc đầu vào và chuyển đổi thành số nguyên
(=điều chỉnh lập chỉ mục và nhận số nguyên tố sinh đôi tương ứng (thấp hơn) từ mảng
_2+sao chép số nguyên tố và thêm 2
", "\đặt dấu phẩy và khoảng trắng giữa hai số nguyên tố


4

Toán học - 63 ký tự

Print[#-2,", ",#]&@Nest[NestWhile[NextPrime,#,#2-#!=2&,2]&,1,n]

Ghi chú

Đây thực tế là một thực hiện khá đơn giản. Rút ngắn dẫn đến hầu như không có obfuscation.

NextPrime là một nội trang tìm thấy số nguyên tố tiếp theo sau một số.

NestWhile[NextPrime,#,#2-#1!=2&,2]& là một hàm ẩn danh tìm số nguyên tố lớn hơn của cặp số nguyên tố sinh đôi tiếp theo sau một số.

Nestáp dụng nlần chức năng ẩn danh này .

Print[#-2,", ",#]&là một chức năng ẩn danh in ra thiết bị xuất chuẩn theo thông số kỹ thuật. Đáng buồn thay, điều này một mình chiếm 18 ký tự của giải pháp 63 ký tự.

Thí dụ

In[1]:= Do[                                                                     
         Print[#-2,", ",#]&@Nest[NestWhile[NextPrime,#,#2-#!=2&,2]&,1,n],
         {n, 1, 10}
        ]
3, 5
5, 7
11, 13
17, 19
29, 31
41, 43
59, 61
71, 73
101, 103
107, 109

Cập nhật: Hai ký tự có thể được lưu bằng cách thực hiện lại giải pháp CJam này . Tuy nhiên, thuật toán này giới hạn giá trị tối đa của n. Chỉ cần thay thế Nest...một phần bằngIntersection[#,#-2][[5]]&@Prime@Range[999]


STDIN của bạn đâu? :)
mfvonh

4

Javascript (E6) 92 96

Ngắn hơn và tuân thủ - sử dụng vỏ spidermonkey để đọc stdin / write stdout (với dấu phẩy và dấu cách). Nó tìm thấy cặp thứ 10000 1260989, 1260991 trong một phút trên PC của tôi
Có thể ngắn hơn bằng cách sử dụng p[n]=o=nthay vì p.push(o=n), do đó mảng p thưa thớt. Nhưng điều đó khá chậm và dù sao tôi cũng sẽ không giành được thời lượng mã.

m=readline();for(n=3,o=p=[];m;n+=2)p.every(e=>n%e)&&(m-=n-o<3,p.push(o=n));print(o-2+', '+o)

Để thử trong bảng điều khiển firefox:

m=prompt();for(n=3,o=p=[];m;n+=2)p.every(e=>n%e)&&(m-=n-o<3,p.push(o=n));alert(o-2+', '+o)

Bị đánh cắp

Một hàm tìm thấy tất cả các cặp song sinh m đầu tiên (trả về giá trị lớn nhất):

T=m=>{
  for (o=n=3, p=[2], t=[]; !t[m-1]; n+=2)
    p.every(e => n%e) && (n-o-2 ? 0 : t.push(n), p.push(o=n))
  return t
}

Thí dụ: console.log(T(50))

[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]

Chỉ cuối cùng:

L=m=>{
  for (o=n=3,p=[2]; m; n+=2)
    p.every(e => n%e) && (m -= n-o==2, p.push(o=n))
  return o
}

Sau đó, lấy 2 dòng đó và thêm IO

m = prompt()
for (o=n=3, p=[2]; m; n+=2)
  p.every(e => n%e) && (m -= n-o==2, p.push(o=n))
alert('o-2+', '+o)

4

J - 49 60 55 51 byte

Tôi quyết định đi với một cách tiếp cận đơn giản. Hàm ttìm số nguyên tố sinh đôi tiếp theo được cung cấp một số nguyên tố làm đầu vào (bây giờ số này được bao gồm trong fhàm). Hàm ftìm số nguyên tố sinh đôi thứ n. Đây cũng là chương trình thực tế đầu tiên tôi viết ở J.

f=:[:(":,', ',":@+&2)(4&p:(,{~-=2:)])^:_@>:^:(]`2:)

Ví dụ:

   f 1
3, 5
   f 2
5, 7
   f 3
11, 13
   f 4
17, 19
   f 5
29, 31
   f 100000
18409199, 18409201

Chỉ cần cho một số lông mày, có phiên bản chưa được chỉnh sửa.

twin =: (4&p:)(($:@[)`(,)@.(=(]+2:)))]
f    =: ((]-2:),])((0:{twin) ^: (]`(2:)))

Giải trình:

f=:[:(":,', ',":@+&2)(4&p:(,{~-=2:)])^:_@>:^:(]`2:)
                     (4&p:(,{~-=2:)])^:_@>:^:(]`2:)
                                        @>:^:(]`2:)  main loop
                                           ^:(]`2:)  Repeat n times, starting with value of 2
                                        @>:          Add one to the current value and apply to the following function.
                     (4&p:(,{~-=2:)])^:_             Get the next twin prime
                                     ^:_             Recurse until there's no change
                          (,{~-=2:)                  If next prime - current value == 2, return current value, otherwise the next prime.
                      4&p:                           Get the next prime
     (":,', ',":@+&2)                                Format the output and add 2 to the second value.
   [:                                                Apply the twin prime to the formatter.

Basically, if n is 4, this creates a recursion tree like this:
 let T be the recursion inside t
 and numbers between rows the return values of according function
   (t * n) 3
-> (t * 4) 3
-> t  t  t  t  3
   17 11 5  3
-> (T  T) (T  T) T  T  3
    17 13  11 7  5  3
-> 17

Điều này cần thêm một chút công việc để tuân thủ các thông số kỹ thuật: "in chúng trên STDOUT, cách nhau bằng dấu phẩy và dấu cách". Tất nhiên điều đó không liên quan đến thuật toán, nhưng nó làm tăng thời lượng của chương trình.
Szabolcs

@Szabolcs tốt hơn?
xem

Chắc chắn, +1. J khá tuyệt.
Szabolcs

@Szabolcs Nó thực sự là. Mặc dù nó thực sự uốn cong tâm trí của tôi. Trở nên dễ dàng hơn mọi lúc (đây là chương trình đầu tiên tôi viết bằng tay). Dù sao cũng cảm ơn.
xem

4

C #, 265

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;}}}

2
+1 nhưng bạn cần thêm một dấu cách sau dấu phẩy khi bạn in các ký tự
Cristian Lupascu

1
bạn có thể lưu thêm hai ký tự nữa: .Count(x=>j%x==0)==2)->.Count(x=>j%x<1)<3)
Cristian Lupascu

2
Ngoài ra, lớp của bạn có thể được gọi Pthay vì Programvà tham số athay vì args.
Cristian Lupascu

1
Sẽ không biên dịch như vậy - bạn có thêm )sau .Count(...)<3. Bạn cũng có thể tiết kiệm một chút bằng cách thay đổi var i=int.Parse(args[0]);int f=0,c=0;thành int i=int.Parse(args[0]),f=0,c=0;. Bạn có thể lưu thêm một số bằng cách trích xuất trình khởi tạo từ vòng lặp, vì vậy c=0;for(int j=1;=> c=0,j=1;for(;.
Bob

Ngoài ra, viết lại hoàn toàn phần thân của forvòng lặp, cộng với sử dụng tên đủ điều kiện thay vì using System: using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}238 ký tự.
Bob


2

Perl, 100 95

$n=<>;$i=3;while($c<$n&&($l=$i++)){$i++until!grep{$i%$_<1}(2..$i-1);$c++if$i-$l<3}print"$l, $i"

Ung dung:

$n = <>;          # Read from STDIN
$i = 3;           # Tiny hack because I know I don't need the number 2
while ($c<$n && ($l = $i++)) {   # $c counts the pairs, $l is the last prime
  $i++ until ! grep {$i%$_<1} (2..$i-1);   # Increase $i until it's not divisible by anything
  $c++ if $i-$l < 3   # If $i and $l are twin primes, count it
}
print "$l, $i"    # That damned comma added a whole character to my code!

2

T-SQL (2008+): 344

Brute buộc một CTE tìm các số nguyên tố, hàm cửa sổ để đếm n, sau đó là một phép nối để tìm cặp song sinh. Hoạt động trong một giây cho đầu ra <1.000, chỉ dưới một phút cho đầu ra <10.000.

Chơi gôn (SQLFiddle tại đây ):

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)

Dễ đọc

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)

1

GolfScript 46

~[1 3]\{\{))}%.{:x,{)x\%!},,2=}/*@\-.}do;', '*

Kiểm tra trực tuyến: liên kết

Mã chú thích:

~                       # parse the input as an int
[1 3]                   # add the array [1, 3] on the stack
\                       # invert the items on the stack
{                       # begin loop
  \                     # bring the array to the top of the stack
  {))}%                 # add 2 to each of the numbers in the array
  .{:x,{)x\%!},,2=}/    # check if numbers are prime (leaves a 0 or 1 for both numbers on the stack)
  *                     # multiply the two 0/1 numbers (will only get 1 if both are 1)
  @\-                   # subtract the result from the inital int
  .                     # copy the new int value on the stack to be consumed by the 'do' loop
}do                     # repeat until the initial int was taken down to 0
                        # at this point the array contains the two numbers we're looking for
;                       # get rid of the 0 from the stack
', '*                   # format the output

1

PHP 5,4, 223

Không phải là một cái nhỏ hơn, nhưng một thử từ php.

$n=$argv[1];function i($k){for($i=2;$i<=(int)($k/2);$i++)if($k%$i==0)return 0;return 1;}function t($t){return (i($t) && i($t+2))?1:0;}$g=1;$d=0;do{if(t($g)==1){if($d<$n){$d++;}else{print_r([$g,$g+2]);break;}}$g++;}while(1);

1

C 309

Tiếp tục nhận các số nguyên tố tiếp theo và lưu trữ các số hạng lẻ và chẵn sau đó kiểm tra xem sự khác biệt có phải là hai không.

int main()
{
int n;
scanf("%d",&n);
int a=2,b=3,k=2,q;
int odd=1;
int p;
if(n>0)
{
while(n)
{
k++;
p=1;
q=ceil(sqrt(k));
for(int i=2;i<=q;i++)
{
if(k%i==0)
{
p=0;
break;
}
}
if(p)
{
if(odd%2==0)a=k;
else b=k;
if(abs(a-b)==2)n--;
odd++;
}
}
}
printf("%d %d\n",a,b);
return 0;
}

1
Xin đừng là căn bậc hai! for (int i=2;i*i<=k;i++)
edc65

1

R, 91 ký tự

a=scan();n=1;p=5;while(n!=a){p=p+1;q=p-2;if(sum(!p%%2:p,!q%%2:q)<3)n=n+1};cat(q,p,sep=", ")

Không có gì thực sự lạ mắt:

a=scan()
n=1
p=5
while(n!=a){
    p=p+1
    q=p-2
    if(sum(!p%%2:p,!q%%2:q)<3) # Check that p and q are both primes by checking
       n=n+1                   # the number of zeroes resulting from 
}                              # p modulo each integers 2 to p and same for q
cat(q,p,sep=", ")

Sử dụng:

> a=scan();n=1;p=5;while(n!=a){p=p+1;q=p-2;if(sum(!p%%2:p,!q%%2:q)<3)n=n+1};cat(q,p,sep=", ")
1: 10
2: 
Read 1 item
107, 109


0

JavaScript (Node.js), 162 ký tự

Đọc từ stdin, xuất ra stdout, thoát "sớm" cho đầu vào <= 0.

t=process.argv[2],c=0,l=1;if(t>0){for(i=0;;i++){p=!Array(i+1).join(1).match(/^1?$|^(11+?)\1+$/);if(p){if(i-2==l){if(c>=t-1){console.log(l+", "+i);break}c++}l=i}}}

Cách sử dụng (tập lệnh ở trên được lưu dưới dạng ntp.js):

>for /l %x in (0, 1, 10) do node ntp.js %x
>node ntp.js 0
>node ntp.js 1
3, 5
>node ntp.js 2
5, 7
>node ntp.js 3
11, 13
>node ntp.js 4
17, 19
>node ntp.js 5
29, 31
>node ntp.js 6
41, 43
>node ntp.js 7
59, 61
>node ntp.js 8
71, 73
>node ntp.js 9
101, 103
>node ntp.js 10
107, 109

0

AWK - 129

Các tập tin fsoe-pairs.awk:

{n=2;N=1
for(;;){if(n in L){p=L[n];del L[n]}else{p=n
if(n-N==2)if(!--$0){print N", "n;exit}N=n}P=p+n++
while(P in L)P+=p;L[P]=p}}

Chạy nó:

$ awk -f fsoe-pairs.awk
1
3, 5
$ awk -f fsoe-pairs.awk
2
5, 7
$ awk -f fsoe-pairs.awk
10
107, 109

(Dòng đầu tiên sau lệnh là đầu vào, dòng thứ 2 là đầu ra)

Điều này dựa trên một thuật toán tạo nguyên tố riêng mà tôi gọi là "rây nổi erastosthenes" (cho đến khi tôi tìm thấy nó được mô tả ở mọi nơi) chỉ lưu trữ phần cần thiết của sàng và các số nguyên tố đã được tính toán.


0

Con trăn 2 (75)

c=input()
n=3
while c:n+=2;c-=all(n%i&~2for i in range(2,n-2))
print(n-2,n)

Vậy chuyện gì đang xảy ra ở đây?

Đầu tiên, chúng ta hãy xem biểu thức all(n%i&~2for i in range(2,n-2)), kiểm tra xem (n-2,n)có phải là một cặp số nguyên tố sinh đôi không.

Biểu thức đơn giản hơn all(n%i for i in range(2,n))chỉ đơn giản là kiểm tra xem ncó phải là số nguyên tố hay không bằng cách thử mọi ước số itrong phạm vi 2<=i<=n-1và xem liệu tất cả các phần còn lại có khác không. Điều này allkiểm tra chính xác điều này, vì Python xử lý 0như Falsevà tất cả các số khác là True.

Bây giờ, quan sát (n-2)%i==0chính xác khi n%i==2cho ước i>2. Vì vậy, chúng ta có thể thực hiện việc kiểm tra tính nguyên trên nn-2đồng thời bằng cách kiểm tra số còn lại cho cả hai 02. Điều này có thể được thực hiện như all(n%i not in [0,2] for i in range(2,n-2)). Chúng tôi chỉ thử các ước số trong phạm vi 2<=i<=n-3vì lợi ích của nó n-2, nhưng điều này ncũng đủ vì n-1n-2không thể là ước số trừ khi n<=4. Chúng tôi sẽ chỉ thử nbắt đầu từ lẻ 5để tránh sự phức tạp này và của ước số i=2.

Chúng tôi biểu thị n%i not in [0,2]thành biểu thức n%i&~2, nhớ rằng đó 0là Sai và các số khác là True. Ưu tiên của nhà điều hành (n%i)&(~2)là chính xác những gì cần thiết. Bổ sung bit ~2...11111101, do đó, bitwise của nó andvới một số không 2thay đổi giá trị vị trí nhị phân của. Điều này mang lại 0(nghĩa là False) chỉ cho 02, chính xác những gì chúng ta muốn.

Phù! Bây giờ chúng ta có biểu thức all(n%i&~2for i in range(2,n-2))kiểm tra xem có phải nlà số trên của một cặp số nguyên tố sinh đôi hay không. Những gì còn lại là lặp đi lặp lại trên chúng cho đến khi chúng ta nhìn thấy cchúng, csố được nhập vào đâu. Chúng tôi bắt đầu với 5và đếm lên 2để tránh các vấn đề chia rẽ. Chúng tôi giảm dần cmỗi khi chúng tôi gặp một nhoạt động, dừng lại khi c=0. Cuối cùng, chúng tôi in cặp nguyên tố sinh đôi mà chúng tôi kết thúc.


0

T-SQL (2012 +), 255 ký tự

Một công cụ tìm thủ tướng sinh đôi T-SQL nhỏ gọn hơn cũng tăng tốc một chút.

with t(n)as(select 2+number from spt_values where type='p')select*from(select concat(b,', ',a),rank()over(order by a)from(select n,lag(n)over(order by n)from t where not exists(select*from t f where f.n<t.n and t.n%f.n=0))z(a,b)where a=b+2)r(s,k)where k=2

Định dạng có thể đọc được của con người ::

    with t(n)as(
        select 2+number 
        from spt_values 
        where type='p'
    )
    select *
    from(
        select concat(b,', ',a),rank() over (order by a)
        from(
            select n, lag(n) over(order by n)


    from t 
        where not exists(
            select 1 from t f 
            where f.n<t.n and t.n%f.n=0)
    ) z(a,b)
    where a=b+2
) r(s,k)
where k=2

Ý chính cơ bản là chúng tôi sử dụng bảng số có sẵn (master..spt_values ​​type = 'p') và bí danh với CTE là một cái gì đó ngắn. Chúng tôi thêm 2 để loại bỏ nỗi lo kéo 0 hoặc 1 lỗi nhỏ cho bộ của chúng tôi, vì vậy bây giờ chúng tôi có các ứng cử viên là 2.2050.

Z hầu hết các truy vấn bên trong có tất cả các số nguyên tố từ 2 đến 2050, bằng cách lọc ra bất kỳ số n nào chia hết cho một số nhỏ hơn n. Sau đó chúng tôi sử dụng một tiện lợi T-SQL 2012 windowing chức năng lagcho phép chúng ta kéo kết quả trước, vì vậy bây giờ kết quả Z của a và b là các số nguyên tố P[n]P[n-1]tương ứng. Truy vấn R tạo chuỗi đầu ra và lọc ra các số nguyên tố không sinh đôi và cũng tạo ra một số thứ tự cho đầu ra mà chúng ta gọi là K. Cuối cùng, truy vấn cuối cùng R cho phép chúng ta lọc và lấy số nguyên tố sinh đôi thứ K bằng cách thay đổi biến của nó.


0

Toán học - 71 byte

n=Input[];
i=j=0;
While[j<n,i++;If[And@@PrimeQ[x={i,i+2}],j++]];Print@x
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.