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


	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的乘积赋值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章