素数筛法
2016-09-22 17:26
162 查看
1.朴素
2.Eratosthenes筛法
把每一个质数的倍数都筛掉
3线性筛
每一个不是质数的数都用最小的因子筛掉。
一开始把所有数都定义为素数,把 [从最小的质数开始* 当前的数的结果数 ]筛掉,如果当前数是小质数的倍数,则退出,原因在于如果这个数是小质数的倍数,当它乘以小质数的下一个质数得结果依然可以被小质数除尽。例如当前数为8,小质数为2,3,5,那么8*2=16被筛掉,而且8%2==0,所以 3 * 8=24就不筛了,因为8是2的倍数,那么3 * 8也一定是2的倍数,因此24这个数使可以被更小的质数2筛掉的。
11.27
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int cnt; int main() { int n;cin>>n; for(int i=1;i<=n;i++) for(int j=2;j<=sqrt(i);j++) { if(i%j==0) { cnt++; break; } } cout<<n-1-cnt<<endl; }
2.Eratosthenes筛法
把每一个质数的倍数都筛掉
#include<iostream> #include<cstdio> using namespace std; bool prime[10000001]; int cnt; int main() { int n;cin>>n; //注意:0表示是,1表示不是 prime[1]=1; for(int i=2;i<=n;i++) if(!prime[i]) for(int j=i;j<=n/i;j++) //从和自己相等的数开始 { prime[i*j]=1; } for(int i=1;i<=n;i++) if(!prime[i]) cnt++; cout<<cnt<<endl; }
3线性筛
每一个不是质数的数都用最小的因子筛掉。
一开始把所有数都定义为素数,把 [从最小的质数开始* 当前的数的结果数 ]筛掉,如果当前数是小质数的倍数,则退出,原因在于如果这个数是小质数的倍数,当它乘以小质数的下一个质数得结果依然可以被小质数除尽。例如当前数为8,小质数为2,3,5,那么8*2=16被筛掉,而且8%2==0,所以 3 * 8=24就不筛了,因为8是2的倍数,那么3 * 8也一定是2的倍数,因此24这个数使可以被更小的质数2筛掉的。
#include<iostream> #include<cstdio> using namespace std; int prime[10000005]; bool flag[10000005]; int n,cnt; int main() { cin>>n; for(int i=2;i<=n;i++) flag[i]=1; for(int i=2;i<=n;i++) { if(flag[i]) prime[++cnt]=i; //for(int j=1;prime[j]<=i && prime[j]*i<=n;j++) //prime不赋初值,如何保证小于i? for(int j=1;j<=cnt && prime[j]*i<=n;j++ ) { flag[prime[j]*i]=0; if(!i%prime[j]) break; } } cnt=0; for(int i=1;i<=n;i++) if(flag[i]==1) cnt++; cout<<cnt<<endl; }
11.27
#include<iostream> #include<cstdio> using namespace std; int n,flag,cnt=1; int prime[10000001]; int main() { // freopen("in.txt","r",stdin); // freopen("out1.txt","w",stdout); cin>>n; prime[cnt]=2; for(int i=3;i<=n;i++) { flag=0; for(int j=1;j<=cnt && prime[j]<i;j++) { if(i%prime[j]==0) { flag=1;break; } } if(flag==0) prime[++cnt]=i; } // for(int i=1;i<=cnt;i++) // cout<<prime[i]<<" "; cout<<cnt<<endl; }
相关文章推荐
- 素数筛法的复杂度
- 素数筛法和测试
- 【数学】素数筛法
- 素数筛法模板
- 埃拉托斯特尼素数筛法
- 高效率素数筛法 代码实现,内含干货
- hdu1905 Pseudoprime numbers (快速幂+素数筛法)
- HDU 3988 Harry Potter and the Hide Story(数论)(素数筛法)
- c语言--简单素数筛法
- 素数筛法算法(C#)
- 素数筛法
- 区间素数筛法
- [51nod1181]质数中的质数(素数筛法)
- HDU 6069 Counting Divisors(区间素数筛法)
- 素数筛法--SPOJ Problem 2 Prime Generator
- PAT - 甲级 - 1059. Prime Factors (25)(素数筛法)
- 素数筛法
- 二倍压缩素数筛法
- 素数筛法
- 素数筛法程序实现