素数筛法

Posted h404nofound

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛法相关的知识,希望对你有一定的参考价值。

参考博客:  https://www.cnblogs.com/Duahanlang/p/3212323.html

 

1.遇见素数时将该素数的倍数都筛掉

//缺陷是会重复筛选有不同素数因子的合数 如 10=2*5 ,将被筛两次

 1 void isprime1()
 2     memset(vis,0,sizeof(vis));
 3     int cnt = 0;
 4     for(int i = 2;i < n;++i)
 5         if(!vis[i])
 6             prime[cnt++] = i;
 7         for(int j = i*2;j <n;j+=i) vis[j] = 1;
 8         
 9     
10 

 

2.线性筛法 当i遍历到为前面已经存储的素数的倍数时跳出循坏

 1 void isprime2()
 2     memset(vis,0,sizeof(vis));
 3     int cnt = 0;
 4     for(int i = 2;i < n;++i)
 5         if(!vis[i]) prime[cnt++] = i;
 6         for(int j = 0;j <cnt&&i*prime[j]<n;++j)
 7             vis[i*prime[j]] = 1;
 8             if(i%prime[j]==0)break;
 9         
10     
11 

 

3.进一步优化

//原理:不管偶数 排除2 并且给4清除标记

 1 void isprime3()
 2      memset(vis,0,sizeof(vis));
 3     int cnt = 1;
 4     prime[0] = 2;vis[4] = 1;
 5     for(int i = 3;i < n;i+=2)
 6         if(!vis[i]) prime[cnt++] = i;
 7         for(int j = 0;j <cnt&&i*prime[j]<n;++j)
 8             vis[i*prime[j]] = 1;
 9             if(i%prime[j]==0)break;
10         
11     
12 

 

以上是关于素数筛法的主要内容,如果未能解决你的问题,请参考以下文章

数学基础素数线性筛法--欧拉筛法模板普通筛法的优化

数学数论素数的线性筛法

练习筛法遍历素数(Java)

素数筛法

欧拉筛法(线性筛)素数

埃氏筛法(素数筛)