素数又叫质数,一个数除了1和他本身没有其他因子的叫素数。
最一般的判断素数写法:
bool prime(int x)
{
if(x<=1) return false;
for(int i=2;i<x;i++)
{
if(x%i==0)
return false;
}
return true;
}
快点的n开平方的复杂度
bool prime(int x) //这是开平方的写法,减小了查询范围。
{
if(x<=1) return false;
for(int i=2;i<=sqrt(x)+0.5;i++)
{
if(x%i==0)
return false;
}
return true;
}
bool prime(int x) //这是乘的写法,让i相乘去和x比较
{
if(x<=1) return false;
for(int i=2;i*i<x;i++)
{
if(x%i==0)
return false;
}
return true;
}
如果让求1~n内的所有素数怎么快速高效求出呢?
这就需要埃式筛选,简称埃筛。
代码:
const int MAX_N=1e5;
int prime[MAX_N]; //记录素数
bool isprime[MAX_N]; //为true表示i为素数
void sieve(int n)
{
int p=0;
for(int i=0;i<=n;i++) isprime[i]=true; //初始化
isprime[0]=isprime[1]=false;
for(int i=2;i<=n;i++)
{
if(isprime[i])
{
prime[p++]=i;
for(int j=2*i;j<=n;j+=i) //如果i是素数,那么i的倍数都不是素数
isprime[j]=false;
}
}
}
求n的质因子
int m[1000];
void init(int n) //N的质因子打表
{
int k=0;
for(LL i=2;i*i<=n;i++)
{
if(n%i==0)
{
m[k++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)
m[k++]=n;
}