1. 程式人生 > >PAT乙級——1007(陣列操作)

PAT乙級——1007(陣列操作)

題目:素數對猜想 (20 分)

讓我們定義d​n​​為:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i個素數。顯然有d​1​​=1,且對於n>1有d​n​​是偶數。“素數對猜想”認為“存在無窮多對相鄰且差為2的素數”。

現給定任意正整數N(<10​5​​),請計算不超過N的滿足猜想的素數對的個數。

輸入格式:

輸入在一行給出正整數N。

輸出格式:

在一行中輸出不超過N的滿足猜想的素數對的個數。

輸入樣例:
20

輸出樣例:
4

素數分析

首先看一個關於質數分佈的規律:   1大於等於5的質數一定和6的倍數相鄰。例如5和7,11和13,17和19等等;   證明:   令x≥1,將大於等於5的自然數表示如下:   ····· 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······   可以看到,不在6的倍數兩側,即6x兩側的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。這裡有個題外話,關於孿生素數,有興趣的道友可以再另行了解一下,由於與我們主題無關,暫且跳過。  這裡要注意的一點是,在6的倍數相鄰兩側並不是一定就是質數。   此時判斷質數可以6個為單元快進,加快判斷速度,原因是,假如要判定的數為n,則n必定是6x-1或6x+1的形式,對於迴圈中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被6i,6i+2,6i+4整除,則n至少得是一個偶數,但是6x-1或6x+1的形式明顯是一個奇數,故不成立;   另外,如果n能被6i+3整除,則n至少能被3整除,但是6x能被3整除,故6x-1或6x+1(即n)不可能被3整除,故不成立。綜上,迴圈中只需要考慮6i-1和6i+1的情況,即迴圈的步長可以定為6,每次判斷迴圈變數k和k+2的情況即可。

程式碼實現

import java.util.Scanner;

public class Main {
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        int n =in.nextInt();
        int temp[]=new int[10000];
        int k=0;
        int count=0;
        for(int i=1;i<=n;i++){
            if(isPrime_3(i)
==1){ temp[k]=i; k++; } } for(int i=1;i<k;i++){ if(temp[i]-temp[i-1]==2) count++; } System.out.print(count); } //判斷是不是素數 static int isPrime_3(int num) { //兩個較小數另外處理 if
(num ==2|| num==3 ) return 1 ; //不在6的倍數兩側的一定不是質數 if(num %6!= 1&&num %6!= 5) return 0 ; double tmp =Math.sqrt(num); //在6的倍數兩側的也可能不是質數 for(int i= 5;i <=tmp; i+=6 ) if(num %i== 0||num %(i+ 2)==0 ) return 0 ; //排除所有,剩餘的是質數 return 1 ; } }