C++ 程式實現分割篩法以生成給定範圍內的素數
這是使用分割篩法生成給定範圍內的素數的 C++ 程式。分割篩法首先應用簡單篩法找到小於等於 √(n) 的素數。該演算法的思路是將範圍 [0 ... n-1] 劃分為不同的段,然後逐個計算各段中的素數。
演算法
Begin Create function to find all primes smaller than limit using simple sieve of eratosthenes. Finds all prime numbers in given range using segmented sieve A) Compute all primes smaller or equal to square root of high using simple sieve B) Count of elements in given range C) Declaring boolean only for [low, high] D) Find the minimum number in [low ... high] that is a multiple of prime[i] (divisible by prime[i]) E) Mark multiples of prime[i] in [low … high] F) Numbers which are not marked in range, are prime End
示例程式碼
#include <bits/stdc++.h> using namespace std; void simpleSieve(int lmt, vector<int>& prime) { bool mark[lmt + 1]; memset(mark, false, sizeof(mark)); for (int i = 2; i <= lmt; ++i) { if (mark[i] == false) { prime.push_back(i); for (int j = i; j <= lmt; j += i) mark[j] = true; } } } void PrimeInRange(int low, int high) { int lmt = floor(sqrt(high)) + 1; vector<int> prime; simpleSieve(lmt, prime); int n = high - low + 1; bool mark[n + 1]; memset(mark, false, sizeof(mark)); for (int i = 0; i < prime.size(); i++) { int lowLim = floor(low / prime[i]) * prime[i]; if (lowLim < low) lowLim += prime[i]; for (int j = lowLim; j <= high; j += prime[i]) mark[j - low] = true; } for (int i = low; i <= high; i++) if (!mark[i - low]) cout << i << " "; } int main() { int low = 10, high = 50; PrimeInRange(low, high); return 0; }
輸出
11 13 17 19 23 29 31 37 41 43 47
廣告