素数筛法
2016-11-16 15:38
162 查看
//素数筛法1 //非线性 #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXN 1000 int main(){ bool array[MAXN+1]; memset(array,true,sizeof(array)); array[0]=array[1]=false; for(int i=2;i<=MAXN/2;i++){ if(array[i]){ for(int j=i+i;j<=MAXN;j+=i){ array[j]=false; } } } for(int i=1;i<=MAXN;i++) if(array[i]) cout<<i<<'\n'; return 0; }
//素数筛法2 //线性 每个素数只被删除一次 //原理: //合理安排删除顺序,使每一个合数只被删除一次 //由任何一个合数均能分解为质数的连乘积 //例如:16=2^4,9=2*3,12=2^2*3,18=2*9(3^2,此时还未删去,但终究会删去) //把因式分解中最小质数写在最左边,即k=p^m*q (1:p=q,当写成k=p^m,m>=2;2:q是比p大且没有被删过的数) //每个合数写成这种分解是唯一的 #include <cstdio> #include <cstring> #include <cmath> #include <iostream> using namespace std; #define MAXN 100 int main(){ int p,q,k; bool array[MAXN+1]; memset(array,true,sizeof(array)); array[0]=array[1]=false; for(p=2;p<=sqrt(MAXN);p++){ if(array[p]){ for(q=p;p*q<=MAXN;q++){ if(array[q]){//q的条件很重要,防止重复删除(具体推导可见本子) for(k=p*q;k<=MAXN;k*=p) array[k]=false; } } } } for(int i=1;i<=MAXN;i++) if(array[i]) cout<<i<<'\n'; return 0; }
//素数筛法3 //线性 //思想: //把合数用它最小的质因子删掉,每个合数被唯一的筛一次 //array[0]处的值代表范围内素数个数 //且array[1]开始的 array[0]个 数为这些素数 #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXN 1000 int main(){ int array[MAXN+1]; memset(array,0,sizeof(array)); for(int i=2;i<=MAXN;i++){ if(!array[i]) array[++array[0]]=i; for(int j=1;j<=array[0]&&array[j]*i<=MAXN;j++){ array[array[j]*i]=1; if(i%array[j]==0)//防止重复删除 推导见本子 break; } } cout<<array[0]<<"\n\n"; for(int i=1;i<=array[0];i++) cout<<array[i]<<'\n'; return 0; }
//素数筛法4 //非线性 //筛完后array[i]为i的最大素因子 #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXN 1000 int main(){ int array[MAXN+1]; memset(array,0,sizeof(array)); array[0]=array[1]=1; for(int i=2;i<=MAXN;i++){ if(!array[i]){ for(int j=i;j<=MAXN;j+=i) array[j]=i; } } for(int i=2;i<=MAXN;i++) cout<<i<<":"<<array[i]<<'\n'; return 0; }
相关文章推荐
- 素数筛法
- 素数筛法
- 素数筛法计算完全数
- hdu FSF’s game 欧拉定理,素数筛法
- 素数筛法
- poj3006---素数筛法
- HDU 3792 Twin Prime Conjecture(素数筛法 + 树状数组)
- hdoj 1431 素数回文【打表+素数筛法+回文数判断】
- poj2689 两次素数筛法
- 【数论】Minimum Sum LCM, UVa10791【唯一分解定理】【素数筛法】
- luogu 1865 数论 线性素数筛法
- poj2635 同余定理 + 素数筛法
- poj 2689 Prime Distance(大数区间素数筛法)
- codeforces 327B(Hungry Sequence) 素数筛法入门(欧拉筛法) Java
- LCM 埃拉托斯特尼素数筛法+位图改进
- Codeforces Beta Round #86 (Div. 2 Only) E Double Happiness 素数筛法,费马平方和定理
- (并查集、素数筛法)合并元素 题解
- 由素数筛法到欧拉函数(欧拉函数,线性筛)
- 素数筛法系列之4 预先删除小素数
- 三种素数筛法汇总