求範圍內質數(素數)
阿新 • • 發佈:2019-01-03
素數定義:除了1和自身之外,不能被其他整數整除。
方法1:質樸的方法,重複呼叫的方法是判斷一個數是不是質數。當求一個數是不是質數時,這種方法是正確的,也沒有優化空間,但是當求一個區間內的質數時,可以進行優化。
方法2:方法1存在的問題是,沒有有效利用已經確定的資訊,也即對後續數字判斷時無法利用已經求得的資訊。如若判斷某一數字為質數,那麼以它為因子的所有數,都不會是質數,故將其剔除。(若想換區時間,必須消耗空間)
總結:方法1是找出所有質數;方法2是剔除所有非質數,判斷是否是非質數,雖然不復雜,但是會重複判斷,故用質數作為因子減少重複的情況。
#include<iostream> #include<vector> using namespace std; bool check(int num) { for (int i = 2; i*i <= num; i++) { if (num%i == 0) { return false; } } return true; } int countprimes(int n) { if (n < 2) return 0; int num = 0; vector<bool> flag(n+1,true); for (int i = 2; i <= n; i++) { if (flag[i]) { num++; cout << i << " "; for (int j = i*i; j <= n; j += i) //剔除非質數,注意從i*i開始,每次加i { flag[j] = false; } } } return num; } int main() { cout << "方法1" << endl; for (int i = 2; i <= 100; i++) { if (check(i)) cout << i << " "; } cout << endl; cout << "方法2" << endl; countprimes(100); system("pause"); return 0; }