首页 > 技术文章 > 素数筛(埃氏筛+欧拉筛)

cautx 2019-08-20 20:36 原文

素数筛

顾名思义,用来筛选素数。

这里介绍两种素数筛:

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 }

 

推荐阅读