1. 程式人生 > >集訓隊日常訓練20181110 DIV210 題解及AC程式碼

集訓隊日常訓練20181110 DIV210 題解及AC程式碼

4375: 孿生素數 分享至QQ空間

Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
Total Submit: 324            Accepted:91

Description

 

所謂孿生素數指的就是間隔為 2 的相鄰素數,它們之間的距離已經近得不能再近了,就象孿生兄弟一樣。最小的孿生素數是 (3, 5),在 100 以內的孿生素數還有 (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和 (71, 73),總計有 8 組。但是隨著數字的增大,孿生素數的分佈變得越來越稀疏,尋找孿生素數也變得越來越困難。那麼會不會在超過某個界限之後就再也不存在孿生素數了呢?

孿生素數有無窮多對!這個猜想被稱為孿生素數猜想,至今沒有被嚴格證明。但藉助於計算機我們確實可以找到任意大數範圍內的所有孿生素數對,接下來給定一個數k,求第k組孿生素數。

 

Input

 

輸入資料有多組,每行為一個正整數k(1<= k <=10000)。

 

Output

 

輸出有兩個整數,以空格隔開,表示第k組孿生素數。

 

Sample Input

 1

Sample Output

 3 5

素數序列Pn,其中Pi+1-Pi=2為孿生素數(素數永遠是人們著迷的話題,包括今年非常火的黎曼猜想)

我們可以知道,這個數並不多,但是讓求的也不多,暴力走一波

1可以先預處理出這些數,判斷x和x+2都是素數

Solution from kelenb

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
bool x(int m)
{
    int i;
    int t=sqrt(m);
    
for(i=2;i<=t;i++) { if(m%i==0) return false; } return true; } int main() { int a[15000]; int i,j,n,k=0; for(i=3;i<1400000;i++) { if(x(i)&&x(i+2)) a[k++]=i; } while(scanf("%d",&n)!=EOF) { printf("%d %d\n",a[n-1],a[n-1]+2); } }