给出2个数,找出素因子分解的形式,给出2数素因子集合并集的基数,以及对应指数的绝对值之和
#include <cstdio>
#include <cstring>
#define abs(a) (a)>(0)?(a):(-(a))
const int maxn=1000000;
const int PRIMERANGE = 1000000;
int prime[PRIMERANGE + 1];
int getPrime()
{
memset (prime, 0, sizeof (int) * (PRIMERANGE + 1));
for (int i = 2; i <= PRIMERANGE; i++)
{
if (!prime[i]) prime[++prime[0]] = i;
for (int j = 1; j <= prime[0] && prime[j] <= PRIMERANGE / i; j++)
{
prime[prime[j]*i] = 1;
if (i % prime[j] == 0) break;
}
}
return prime[0];
}
int factor[100][3], facCnt;
int factor2[100][3];//only for this
int getFactors(int x)
{
facCnt = 0;
memset(factor,0,sizeof(factor));
int tmp = x;
for(int i = 1; prime[i] <= tmp / prime[i]; i++)
{
factor[facCnt][1] = 1, factor[facCnt][2] = 0;
if(tmp % prime[i] == 0)
factor[facCnt][0] = prime[i];
while(tmp % prime[i] == 0)
factor[facCnt][2]++, factor[facCnt][1] *= prime[i], tmp /= prime[i];
if(factor[facCnt][1] > 1) facCnt++;
}
if(tmp != 1)
factor[facCnt][0] = tmp, factor[facCnt][1] = tmp, factor[facCnt++][2] = 1;
return facCnt;
}
int ans,cntans;
int I=0;
int main ()
{
getPrime();
int n,m;
while (scanf("%d%d",&n,&m),(n||m))
{
int cntn=getFactors(n);
memcpy(factor2,factor,sizeof(factor));
int cntm=getFactors(m);
int pn=0,pm=0;
ans=cntans=0;
while (pn<cntn && pm<cntm)
{
if(factor2[pn][0]<factor[pm][0]){ans++;cntans+=factor2[pn][2]; pn++;}
else
if(factor[pm][0]<factor2[pn][0]){ans++;cntans+=factor[pm][2]; pm++;}
else
{ans++ ; cntans+=abs(factor[pm][2]-factor2[pn][2]);pn++; pm++;}
}
ans+=(cntn-pn+cntm-pm);
while (pn<cntn)
cntans+=factor2[pn++][2];
while (pm<cntm)
cntans+=factor[pm++][2];
printf("%d. %d:%d\n",++I,ans,cntans);
}
return 0;
}