欧式线性筛法(筛选素数)


	for(int i=2;i<1000001;i++){
		if(a[i]==0)b[l++]=i;
		for(int j=0;j<l;j++){
			if(b[j]*i>1000000)break;
		     a[b[j]*i]=1;
		     if(i%b[j]==0)break;
		}
}

可快速求一个区间内的素数个数和值
常识

一切合数都可以由一个素数乘合数或素数得来

思想:

首先此算法时间复杂度最低,因为在给相应合数赋1时可以做到不重不漏。
此方法最难之处:
if(i%b[j]==0)break;
如果没有此处那么循环会继续进行,而 i*b[j+1]%b[j]==0;因此某一个合数会被重复赋值。而加上此语句会使每个合数被最小的质因子与i的乘积赋值

发布了93 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43813373/article/details/102672356