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
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP