篩選法求質數

荔枝在哪里發表於2024-05-05

今天學到一個求質數簡單易懂的演算法,效率也很高的求職質數演算法,開一個陣列,從前往後遍歷,如果沒有被標記證明是質數,沒錯找到一個質數就被該質數的倍數標記排除,最後得到的陣列就是質數了,程式碼如下

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
const int N = 1e+7;
vector<int> v;
bool st[N];

void getPrimes(int n)
{
    for (int i = 2; i <= n; i++) {
        if (st[i]) continue;
        //如果沒有被標記過就是質數 
        v.push_back(i);
        //將後面的倍數都排除掉
        for (int j = i + i; j <= n; j += i) st[j] = true;
    }
}

signed main() {
	int n;
	cin >> n; 
	//篩到m的平方根即可 
    getPrimes(n);
    for (int i = 0; i < v.size(); i++) {
    	cout << v[i] << " ";
	}
}

相關文章