在整个自然数的集合里,质数的数量不多,对于一个足够大的整数N,不超过N的质数大约有N/ln N个。
1.判断一个数是否为素数
int isPrime(int n)
{ //返回1表示判断为质数,0为非质数,在此没有进行输入异常检测
float n_sqrt;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5;i<=n_sqrt;i+=6)
{
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
2.筛素数
普通筛法
bool notprime[MAXN];
int primes[700005]; //素数从i=1开始
void get_prime()
{
notprime[1]=true;
for(int i=2;i<MAXN;++i)
if(!notprime[i])
{
primes[++primes[0]]=i;
for(long long j=(long long)i*i;j<MAXN;j+=i)
notprime[j]=true;
}
}
Eratothenes筛法
思想:任意整数x的倍数2x,3x,…都不是质数
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int v[10001];
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[i*j]=1;
}
}
}
int main(){
int m;
scanf("%d",&m);
primes(m);
return 0;
} //输出小于m的所有质数
线性筛法
v记录每个数的最小质因子
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int v[10001],prime[10001];
void primes(int n){
memset(v,0,sizeof(v));
int 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;
//prime[j]是合数i*prime[j]的最小质因子
v[i*prime[j]]=prime[j];
}
}
for(int i=1;i<=m;i++){
cout<<prime[i]<<endl;
}
}
int main(){
int m;
scanf("%d",&m);
primes(m);
return 0;
}
3.质因数分解
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int p[10001],c[10001];
void divide(int n){
int m=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
p[++m]=i,c[m]=0;
while(n%i==0)n/=i,c[m]++;
}
}
if(n>1){
p[++m]=n;
c[m]=1;
}
for(int i=1;i<=m;i++){
cout<<p[i]<<"^"<<c[i]<<endl;
}
}
int main(){
int m;
scanf("%d",&m);
divide(m);
return 0;
}
4.素数打表
void db(){
prime[0]=1;
prime[1]=1;//1表示不是素数
for(int i=2;i<=maxn;i++){
for(int j=i*2;j<=maxn;j+=i){
if(!prime[j]){
prime[j]=1;
}
}
}
}