【浙江大學PAT真題練習乙級】1007 素數對猜想 (20分) 真題解析

題目描述

  讓我們定義dnd_{n}dn=pn+1pnd_{n}=p_{n+1}-p_{n},其中pip_{i}是第ii個素數。顯然有d1=1d_{1}=1,且對於n>1n>1dnd_{n}是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。

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

輸入格式:

  輸入在一行給出正整數N

輸出格式:

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

輸入樣例:

20

輸出樣例:

4

思路解析

  • c++

  這道題目的關鍵就在於找素數,用for循環判斷每個數是不是素數,如果是再與前一個素數對比,若差值爲2則計數count加1。

  素數的查找可以定義一個函數,對輸入進來的數先開方得到kk,然後做for循環到kk,如果能被整除則不是素數。這裏要注意任何數除1都能被整除,所以i要從2開始。

  如果沒有找到素數的話ii就會大於kk。如果輸入的待驗證數是1,則開方向下取整k=1k=1,輸入的待驗證數是2、3同理。

  • python

  上述C++的思想python實現就炸了,超時了,因此想了好久,後來還是百度去看看找素數的時間複雜度能不能降到O(n)O(n),沒想到還真有,大概的意思就是先創建一個數組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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章