PAT 自測2 素數對猜想

2021-07-03 06:54:19 字數 1954 閱讀 1757

讓我們定義 dn 為:dn = pn+1 - pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。「素數對猜想」認為「存在無窮多對相鄰且差為2的素數」。

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

輸入格式:每個測試輸入包含1個測試用例,給出正整數n。

輸出格式:每個測試用例的輸出佔一行,不超過n的滿足猜想的素數對的個數。

輸入樣例:

20
輸出樣例:
4
自己的實現思想:

首先從2開始到給定正整數(肯定大於2)中取得所有素數,動態存放在陣列中。

然後遍歷陣列並比較相鄰兩個元素差,如果為2,則計數器+1。

實現**如下:

#include #include #include int isprime(int num) 

}return 1;

}int primenumber(int number)

}free(p);

int primecount = 0;

for (int i = 0; i < count - 1; i++)

}return primecount;

}int main(void)

isprime函式判斷指定數字是否為素數,如果是素數返回1,否則返回0。

判斷依據是從2到n-1相除,如果餘數為0則說明不是素數。

primenumber函式是執行主體。

宣告動態陣列存放素數。

迴圈陣列並進行比較輸出。

執行結果如下:

insert number: 20

p[0] = 2

p[1] = 3

p[2] = 5

p[3] = 7

p[4] = 11

p[5] = 13

p[6] = 17

p[7] = 19

p[2] - p[1] = 5 - 3 = 2

p[3] - p[2] = 7 - 5 = 2

p[5] - p[4] = 13 - 11 = 2

p[7] - p[6] = 19 - 17 = 2

result is 4

之後在網上找到了更簡潔有效的**:

#include #include #include #include #define maxn 100000

int a[maxn];

int isprime(int num);

int main()}}

printf("%d",cnt2);

return 0;

}int isprime(int num)

return flag;

}

定義了最大整數100000

並以該整數為界限建立陣列的全域性變數。

使用memset對陣列進行初始化(清零)。

cnt1用來指示素數個數,同時作為陣列下標。a[2] = 2,所以i從3開始,cnt1從3開始。

cnt2指示滿足素數對條件的元素個數。

在迴圈中首先判斷是否是素數,如果是素數則放入陣列中。

在判斷到是素數時,在將當前素數與陣列中前乙個素數相減(因為陣列下標從3開始,下標為2的值為2,所以陣列中肯定存在前乙個元素)。

如果結果為2,則將素數對計數器+1。

該段**優點:

只迴圈一次即實現題目要求。**簡潔。

在判斷素數時使用平方根,減少迴圈次數。

(基於合數一定至少有乙個不大於sqrt(num)的約數的理論)

執行結果如下:

20

4

PAT 自測2 素數對猜想

自測 2 素數對猜想 20分 讓我們定義dnd n 為 dn pn 1 pnd n p n 1 p n 其中pip i 是第i i個素數。顯然有d1 1d 1 1,且對於n 1 n 1有dnd n 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 10 5 請計算...

自測2 素數對猜想

讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。輸出格式 ...

自測 2 素數對猜想

讓我們定義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。輸出格式 在一行中輸出...