板栗說算法 之 PAT 乙級 1007 素數對猜想(解決超時問題)(全方面解析)

一、題目

讓我們定義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.何爲素數,如何判斷

素數就是隻能被1 和自身整除的數,判斷一開始我使用了2到n-1進行判斷是否爲素數。但是後面我提交發現,運行超時錯誤。那麼肯定是算法效率的問題,我把n-1換成sqrt(n)就好了。

2.使用vector來錄入n範圍內的素數。

3.遍歷進行判斷這個數跟後一個數只差是否爲2,之後計數器加一。

三、代碼實現

#include <iostream>
using namespace std;

#include <vector>

#include <cmath>
int main()
{
    //f錄入用戶輸入
    int num;
    cin >> num;
    
    //數組存放素數
    vector<int>array;
    
    //循環遍歷判斷是否爲素數
    for(int i = 1; i <= num; i++)
    {
        //臨時變量用來判斷是否爲素數
        int temp = 0;
        
        //除了1和本身之外被整除就算是素數
        for(int j = 2; j <= sqrt(i) ; j++)
        {
            
            if(i % j == 0)
            {
                temp++;
                break;
            }
        }
        
        //添加進數組
        if(temp == 0)
        {
            array.push_back(i);
        }
    }
    
    //計數器
    int top = 0;
    
    //循環進行比較
    for(vector<int>::iterator it = array.begin(); it < array.end(); it++)
    {
        if(* (it+1) - *it == 2)
        {
            top++;
        }
    }
    cout << top;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章