给你一个数n(2<=n<=1000000),求n的质因数。
欧拉筛法(O(n)):素数的倍数一定为合数,我们每找到一个数,就将其素数倍数的数标记为合数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool is_prime[1000000+10];
int prime[1000000+10];
int ans[1000000+10];
int main()
{
memset(is_prime,1,sizeof(is_prime));
is_prime[0]=0,is_prime[1]=0;
int total=0;
for(int i=2;i<=1000000;i++)
{
if(is_prime[i])//将找到的素数记录下来
{
total++;
prime[total]=i;
}
for(int j=1;j<=total&&i*prime[j]<=1000000;j++)
{
is_prime[i*prime[j]]=0;//i*素数标记为合数
if(i%prime[j]==0)//后面的都被筛过了
{
break;
}
}
}
int n;
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=total&&prime[i]*prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
cnt++;
ans[cnt]=prime[i];
}
while(n%prime[i]==0)
{
n/=prime[i];
}
}
if(n!=1)
{
cnt++;
ans[cnt]=n;
}
for(int i=1;i<=cnt;i++)
{
printf("%d ",ans[i]);
}
return 0;
}