素数筛
质因数分解代码
int p[100005],m,c[100005]; void divide(int n){ m=0; for(int i=2;i*i<=n;i++){ if(n%i==0){//i是质数 p[++m]=i;c[m]=0; while(n%i==0) n/=i,c[m]++;//除掉所有的i } } if(n>1) p[++m]=n,c[m]=1; for(int i=1;i<=m;i++) cout<<p[i]<<"^"<<c[i]<<endl; }
素数判断代码:根号n
bool isprime(int a){ if(a<=1) return 0; for(int i=2;i<=sqrt(a);i++) if(a%i==0) return 0; return 1; }
Eratosthenes筛选法nloglogn
思路:质数的倍数一定不是质数
int v[100005]; void primes(int n){ memset(v,0,sizeof(v));//合数标记 for(int i=2;i<=n;i++){ if(v[i]) continue; cout<<i<<endl; for(int j=i;j<=n/i;j++) v[j*i]=1; } }
线性筛法
const int MAXN=1000005; int v[MAXN],prime[MAXN],m; void primes(int n){ memset(v,0,sizeof(v)); m=0; for(int i=2;i<=n;i++){ if(v[i]==0){ v[i]=i; prime[++m]=i; } for(int j=1;j<=m;j++){ if(prime[j]>v[i]||prime[j]>n/i) break; v[i*prime[j]]=prime[j]; } } for(int i=1;i<=m;i++) cout<<prime[i]<<endl; }