素数筛(埃氏筛+欧拉筛)
素数筛
顾名思义,用来筛选素数。
这里介绍两种素数筛:
1.埃氏筛(埃拉托斯特尼筛法)
1 void ass() 2 { 3 memset(u,true,sizeof(u));//u[i]=true表示i是素数 4 for(int i=2; i<=1100000; i++) 5 { 6 if(u[i]) 7 for(int j=2; j<=1100000; j++) 8 { 9 if(i*j>1100000) break; 10 u[i*j]=false;//素数×j(j>=2)一定是合数 11 } 12 } 13 }
2.欧拉筛
1 void olas()//su[]用来存素数的值 2 { 3 int i,j; 4 num=1;//num记录素数个数 5 memset(u,true,sizeof(u));//u[i]=true表示i是素数 6 for(int i=2;i<=1000000;i++) 7 { 8 if(u[i]) su[num++]=i; 9 for(int j=1;j<num;j++) 10 { 11 if(i*su[j]>1000000) break;//超出判定的范围 12 u[i*su[j]]=false;//因为素数×i(i>=2)一定是合数。 13 if(i%su[j]==0) break;//这个是欧拉筛减少时间开销的关键
14 } 15 } 16 }