C++利用用埃式篩法求解素數
埃式篩法
首先要瞭解什麼式埃式篩法之前,需要知道一個定理。
就是素數的整數倍一定不是素數。
瞭解瞭這個就基本大概懂瞭埃式篩法。
- 首先初始化一個佈爾數組is_prime,用於記錄每個數是否為素數。
- 從2開始,枚舉每個數i,如果is_prime[i]為true,則i是素數,添加到素數數組primes中。
- 然後對於每個i,我們讓我擴大j倍,直到i*j小於輸入的數字n,把is_prime[i * j]賦值為false。
- 重復步驟2和3,直到遍歷到n為止。
埃式篩法求解某一個數字包含的所有素數數組
Code
#include <iostream> #include <vector> #include <ctime> using namespace std; vector <int> sieve_of_eratosthenes(int n) { vector <int> primes; vector <bool> is_prime(n + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; i++) { if (is_prime[i]) { primes.push_back(i); } for (int j = 2; i * j <= n; j++) { is_prime[i * j] = false; } } return primes; } int main() { clock_t start, end; start = clock(); int n; cout << "Please Enter n: "; cin >> n; vector <int> primes = sieve_of_eratosthenes(n); cout << "Primes: "; for (int prime : primes) { cout << prime << " "; } cout << "\n素數個數為" << primes.size() << "個\n"; end = clock(); cout << "The run time is: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << endl; return 0; }
運行結果
埃式篩法判斷某一個數字是否為素數
Code
#include <iostream> #include <vector> #include <ctime> using namespace std; // 埃式篩法求解素數 bool sieve_of_eratosthenes(int n) { vector <bool> is_prime(n + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i <= n; i++) { if (is_prime[i] && i == n) { return true; } for (int j = 2; i * j <= n; j++) { is_prime[i * j] = false; if (i * j == n) { return false; } } } } int main() { clock_t start, end; start = clock(); int n; cout << "Please Enter n: "; cin >> n; if (sieve_of_eratosthenes(n)) { cout << n << "是素數!!!"; } else { cout << n << "不是素數..."; } end = clock(); cout << "The run time is: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << endl; return 0; }
運行結果
到此這篇關於C++利用用埃式篩法求解素數的文章就介紹到這瞭,更多相關C++求解素數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++使用chrono庫處理日期和時間的實現方法
- C++STL教程之vector模板的使用
- C++中cin>>n的返回值
- C語言中的時間函數clock()和time()你都瞭解嗎
- C++如何判斷一個數是不是素數