題目描述
讓我們定義爲,其中是第個素數。顯然有,且對於有是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。
現給定任意正整數N
( ),請計算不超過N
的滿足猜想的素數對的個數。
輸入格式:
輸入在一行給出正整數N
。
輸出格式:
在一行中輸出不超過N
的滿足猜想的素數對的個數。
輸入樣例:
20
輸出樣例:
4
思路解析
- c++
這道題目的關鍵就在於找素數,用for循環判斷每個數是不是素數,如果是再與前一個素數對比,若差值爲2則計數count加1。
素數的查找可以定義一個函數,對輸入進來的數先開方得到,然後做for循環到,如果能被整除則不是素數。這裏要注意任何數除1都能被整除,所以i要從2開始。
如果沒有找到素數的話就會大於。如果輸入的待驗證數是1,則開方向下取整,輸入的待驗證數是2、3同理。
- python
上述C++的思想python實現就炸了,超時了,因此想了好久,後來還是百度去看看找素數的時間複雜度能不能降到,沒想到還真有,大概的意思就是先創建一個數組all_num(2-input_num),對裏面每個數只判斷一遍是不是素數,判斷的依據就是如果一個數是之前素數的倍數,那這個數就一定不是素數(由於2是素數,所以二的倍數全部設置爲0,依此類推,如果循環到某個數大於0,就一定不是之前某個素數的倍數,就是一個素數啦)。
有點繞,具體可以看代碼。
C++實現
#include<stdio.h>
#include<math.h>
int issushu(int num){
int i;
int k = (int)sqrt(num);
for(i=2; i<=k;i++){
if(num%i==0){
return 0;
}
}
if(i>k){
return 1;
}
}
int main(){
int input_num;
int p_nn = 0;
int p_n = 0;
int count_num = 0;
scanf("%d", &input_num);
for(int i=0; i<=input_num; i++){
if(issushu(i)){
p_n = p_nn;
p_nn = i;
if(p_nn-p_n==2){
count_num++;
}
}
}
printf("%d", count_num);
}
Python實現
input_num = int(input())
all_num = [i for i in range(0, input_num+1)]
count = 0
p_n = 1
for i in all_num:
if all_num[i] > 1:
for j in range(2*i, input_num+1, i):
all_num[j]=0
if (all_num[i]-p_n)==2:
count += 1
p_n = all_num[i]
print(count)