1. 程式人生 > 其它 >PAT乙級1007——素數對猜想

PAT乙級1007——素數對猜想

PAT1007

題目:

題目詳情 - 1007 素數對猜想 (20 分) (pintia.cn)

分析:

這道題不難,但是還是耗費了我的一定時間(特別是最後除錯的時候),我的思路有兩種:

一、

把所有不大於N的素數都求出來,儲存到一個數組裡面(姑且稱為a),遞迴這個陣列,如果發現a[i]+2==a[i+1],那麼說明我們發現了一個素數對

二、

從2開始,求大於2小於N的各個奇數,如果某個數i是素數且i+2也是素數(i+2<=N),那麼說明找到了一個素數對

實際操作,我先選擇了思路二,程式碼如下,全部通過了:

#include <iostream>
#include <cmath>
int
IsPrime(int x) //判斷n是否為素數 { if (x==2) { return 1; //1和2是素數,return true } else { int i; for (i=2;i<=sqrt(x);i++) { if (x%i==0) { return 0; //不是素數 } } } return 1; } int main() {
using namespace std; int n; cin>>n; //讀取數字n int couple=0; //素數對的個數 for (int i=2;i<n;i++) { if (IsPrime(i)) //i是素數 { if (IsPrime(i+2)&&(i+2)<=n) //i+2也是素數 { //cout<<i<<endl; couple++; } } } cout
<<couple; return 0; }

總結遇到的一些知識點:

1.0代表false 1代表true

2.判斷某個數是否是素數:1)從2開始再判斷 2)用到sqrt函式,此函式在C語言裡面在math.h中,在C++裡面是cmath 3)注意迴圈退出條件

判斷素數這個函式太重要了!!!居然第一次寫錯了!!

注意是 i<=sqrt(n),不要忘了“=”(不然4就會判斷錯!!!)

反思反思:程式題寫不快,有思路但是除錯報錯,唯一的解釋就是:基礎功不紮實!!!

下面是一個小優化:偶數不是素數,直接從3開始再算:

#include <iostream>
#include <cmath>
int  IsPrime(int x)  //判斷n是否為素數 
{
    if (x==2)
    {
        return 1;    //1和2是素數,return true
    } 
    else
    {
        int i;
        for (i=2;i<=sqrt(x);i++)
        {
            if (x%i==0)
            {
                return 0; //不是素數 
            }
        }
    }
    return 1;
}
int main()
{
    using namespace std;
    int n;
    cin>>n;        //讀取數字n 
    int couple=0;  //素數對的個數
     
    for (int i=3;i<n;i+=2)  //優化:2不是,偶數也不是 
    {
        if (IsPrime(i))  //i是素數 
        {
            if (IsPrime(i+2)&&(i+2)<=n)  //i+2也是素數 
            {
                //cout<<i<<endl;
                couple++;
            }
        }
    }
    cout<<couple;
    return 0;
}

題解二

針對題解一中重複判斷5是否為素數的問題,我們至少有兩種方法解決:

  1. 建一個數組儲存所有素數
  2. 用一個變數儲存上一個素數且不斷更新

網上搜到的題解有方法一,也有方法二,這裡採用後者。

// PAT BasicLevel 1007
// https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744

#include <iostream>
#include <cmath>
using namespace std;

bool isPrime(int num);

int main()
{
    // 獲取使用者輸入的數字
    int N=0;
    cin >> N;

    // 素數對的個數
    int count=0;

    // 上一個素數
    int lastPrime=2;    

    // 計算素數對個數
    for(int i=3;i<=N;i+=2){   // 偶數除了2一定不是素數
        // 找到新的素數
        if(isPrime(i)){
            
            // 判斷是否為素數對
            if(i-lastPrime==2){ //兩個素數之差為2
                count++;    // 計數
            }

            // 更新上一個素數
            lastPrime=i;
        }
    }

    // 輸出結果
    cout << count;

    //system("pause");
    return 0;
}

// 判斷是否為素數
bool isPrime(int num)
{
    // 1不是素數
    if(num<=1)
        return false;

    // 用這種方法找素數找的比較快,相當於i<sqrt(num),但這樣精度可能損失,導致錯誤
    for (int i = 2; i*i <= num; i++){
        if (num%i==0)
            return false;
    }

    return true;
    
}

來源:PAT乙級1007 - 臭鹹魚 - 部落格園 (cnblogs.com)