欧拉筛代码讲解

简介

欧拉筛是在埃氏筛法的基础上优化了部分操作,使时间复杂度达到了O(n)。

实现代码

#include <iostream>
using namespace std;

int main()
{
	int n;
	cout << "输入一个数字n,将输出2-n的所有素数" << endl;
	cin >> n;
	bool* a = new bool[n]();  //表示是否为素数,0是素数,1是合数
	int* b = new int[n]();  //记录素数
	int j = 0;  //表示素数个数
	for (int i = 2; i < n+1; i++) {    //i表示一个数
		if (a[i - 1] == 0) {   //这里单独判断一下,是素数,就加进去。
			b[j++] = i;
		}
		//这个循环是独立于上面的判断条件的。
		//因此,对于每个i,其实,都去乘以了每个素数(满足乘积小于n+1的条件下)
		//这里终于理解了!
		for (int k = 0; k < j&&i*b[k]<n+1; k++) {  
			a[i * b[k]-1] = true;
			if (i % b[k] == 0) break;  //这里是欧拉筛优化的地方,只被第一个质因数算一下,后面的就直接略过。
			//但是这里不会出现一个数,他本可以在这一次循环给判断为true了,实际却等到了以后,那又怎么保证一定可以不漏呢?
			//数学可以!比如说是30,i等于6时,不行,i等于10时,不行,i等于15时,才可以。
		}
	}
	for (int i = 0; i < j; i++) {
		cout << b[i] << " ";
	}
	delete[]a;
	delete[]b;
	return 0;
}

主要的地方都做了详细的注释。
谢谢阅读!

发布了27 篇原创文章 · 获赞 0 · 访问量 409

猜你喜欢

转载自blog.csdn.net/weixin_40007143/article/details/104126558