原理
∀N>1,若N不为素数,则有
其中p1<p2<…<pn均为素数,an均为正整数。
方法
枚举1~sqrt(n)范围内所有素数p,判断p是否为n的因子。是因子时,将该因子个数标记递增,并使n=n/p,直至不是因子为止。当上述步骤结束后,若n仍大于1,则n有且仅有一个大于sqrt(n)的因子,记录并加入数组即可。
枚举素数时首先要找出所有的素数,这里使用的是欧拉筛 点击查看素数筛
代码实现
#include<bits/stdc++.h>
using namespace std;
int ans[1000001];
int check[1000001];
int pri[100001];
int cnt;
void euler(int n)
{
for(int i=2;i<=n;i++)
{
if(!check[i])
pri[++cnt]=i;
for(int j=1;pri[j]*i<=n;j++)
{
check[pri[j]*i]=1;
if(i%pri[j]==0)
break;
}
}
}
void division(int n)
{
for(int i=2;i<=sqrt(n);i++)
{
while(n%i==0)
{
ans[++cnt]=i;
n=n/i;
}
}
if(n>1)
ans[++cnt]=n;
}
int main()
{
int n;
scanf("%d",&n);
euler(n);
cnt=0;
division(n);
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
return 0;
}