UVA 993 Product of digits

UVA_993

首先我们考虑,什么情况下会是-1?显然是当x不能分解成10以内素数乘积的时候,那么我们直接把x分解素数然后依次输出就可以了吗?也不行。

至于为什么不行,我们不妨想一下怎么保证最后的数最小。首先,要数最小,肯定是先输出小的数字再输出大的,其次,我们也要保证数字的个数尽可能少,而且我们要优先去保证这一点。

想到这里,我们不妨看一下10以内的数:23456789,其中8可以兼并32,于是我们先要看x包含几个8,其次,469都能兼并两个数,而且他们最大能兼并的数字之和是一定的,不会因兼并策略的改变而改变,但是为了保证小的数字更多,我们便要先考虑4,再考虑6,最后考虑9。剩下的2357再依次看一下就可以了。

#include<stdio.h>
int a[10];
int judge(int x)
{
int i;
memset(a,0,sizeof(a));
while(x%8==0)
{
a[8]++;
x/=8;
}
while(x%4==0)
{
a[4]++;
x/=4;
}
while(x%6==0)
{
a[6]++;
x/=6;
}
while(x%9==0)
{
a[9]++;
x/=9;
}
for(i=2;i<8;i++)
{
while(x%i==0)
{
a[i]++;
x/=i;
}
}
if(x!=1)
return 0;
else
return 1;
}
int main()
{
int i,j,k,Q,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&Q);
if(Q==0)
printf("0\n");
else if(Q==1)
printf("1\n");
else if(judge(Q))
{
for(i=2;i<10;i++)
while(a[i])
{
printf("%d",i);
a[i]--;
}
printf("\n");
}
else
printf("-1\n");
}
return 0;
}


原文地址:https://www.cnblogs.com/staginner/p/2193004.html