埃式筛法

筛法

筛质数

给定一个正整数 nn,请你求出 1∼n 中质数的个数。

输入格式

共一行,包含整数 nn。

输出格式

共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围

1≤n≤106

输入样例:

8

输出样例:

4

思想就是将每个数的倍数全部删掉,剩余的就是所有质数

image-20210708150004315

image-20210708150152165

未优化

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1000010;

int primes[N], cnt;
bool st[N];

void get_primes(int n) {
	for (int i = 2; i <= n; i++) {
		if (!st[i]) {
			primes[cnt++] = i;
		}
		for (int j = i + i; j <= n; j += i) {
			st[j] = true;
		}
	}
}


int main() {
	int n;
	cin >> n;
	get_primes(n);

	cout << cnt << endl;
	return 0;
}

优化

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1000010;

int primes[N], cnt;
bool st[N];

void get_primes(int n) {
	for (int i = 2; i <= n; i++) {
		if (!st[i]) {
			primes[cnt++] = i;
			for (int j = i + i; j <= n; j += i) {
				st[j] = true;
			}
		}
		
	}
}


int main() {
	int n;
	cin >> n;
	get_primes(n);

	cout << cnt << endl;
	return 0;
}
posted @ 2021-07-13 17:38  JK~  阅读(55)  评论(0)    收藏  举报