根据唯一分解定理,任何一个数都可以分解成若干个素数的乘机,代码如下:
//factor[i][0]存放分解的素数
//factor[i][1]存放对应分解的素数出现的次数
//fatCnt存放分解出的素数的个数(相同出现的只算一次)
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=100000;///MAXN的大小与题目规模有关
int prime[MAXN+1];
void getPrime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;i++)
{
if(!prime[i])
prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
long long factor[100][2];
int fatCnt;
int getFactors(long long x)
{
fatCnt=0;
long long tmp=x;
for(int i=1;prime[i]<=tmp/prime[i];i++)
{
factor[fatCnt][1]=0;
if(tmp%prime[i]==0)
{
factor[fatCnt][0]=prime[i];
while(tmp%prime[i]==0)
{
factor[fatCnt][1]++;
tmp/=prime[i];
}
fatCnt++;
}
}
if(tmp!=1)
{
factor[fatCnt][0]=tmp;
factor[fatCnt++][1]=1;
}
return fatCnt;
}
int main()
{
long long n;
getPrime();
cin>>n;
int num=getFactors(n);
for(int i=0;i<num;i++)
{
cout<<factor[i][0]<<" "<<factor[i][1]<<endl;
}
return 0;
}
ps:代码主要参考kuangbin