PAT乙級1007——素數對猜想
阿新 • • 發佈:2021-11-23
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> intIsPrime(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是否為素數的問題,我們至少有兩種方法解決:
- 建一個數組儲存所有素數
- 用一個變數儲存上一個素數且不斷更新
網上搜到的題解有方法一,也有方法二,這裡採用後者。
// 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; }