1.
筛法
void primes(int n)
{
memset(v,0,sizeof(v));
cnt=0;
for(int i=2;i<=n;i++)
{
if(v[i]) continue;
prime[++cnt]=i;
for(int j=i;j<=n/i;j++)
v[i*j]=1;
}
}
2. 线性筛法
设数组 记录每个数的最小质因子,按照以下步骤维护
:
- 依次考虑
之间的每一个数
。
- 若
,说明
是质数,把它保存下来。
- 扫描不大于
的每个质数
,令
。也就是在
的基础上累积一个质因子
。因为
,所以
就是合数
的最小质因子。
时间复杂度:
代码:
void primes(int n)
{
memset(prime,0,sizeof(prime));
memset(v,0,sizeof(v));
cnt=0;
for(int i=2;i<=n;i++)
{
if(v[i]==0)
{
prime[++cnt]=i;
v[i]=i;
}
for(int j=1;j<=cnt;j++)
{
if(prime[j]>v[i]||prime[j]>n/i)
break;
v[i*prime[j]]=prime[j];
}
}
}
3. 质因数分解
任何一个大于1的正整数都能唯一分解为有限个质数的乘积,可写作:
其中 都是正整数,
都是质数,且满足
试除法 筛法的思想
代码:
void divide(int n)
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
p[++cnt]=i;
c[cnt]=0;
while(n%i==0)
{
n/=i;
c[cnt]++;
}
}
}
if(n>1)
{
p[++cnt]=n;
c[cnt]=1;
}
for(int i=1;i<=cnt;i++)
printf("%d %d\n",p[i],c[i]);
}