题意:我们可以把一个数A变成B=A的各位乘积,现在给出B,求是否可以有某个A通过计算得到B,有的话,是多少。
题解:贪心。
我们先分解B,若质因数有大于等于10的显然就不行了。
否则则一定可以把他的各因数排在一起成为A,使A的各位乘积=B。
贪心策略:把小数放前面。
注意:
一、不一定要质因数,10以内即可。
二、需要高精度。
三、A!=B
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1005
using namespace std;
char s[N],t[N];
int bang[15],n;
bool div(int p)
{
int i,x=0;
memset(t,0,sizeof(t));
for(i=1;i<=n;i++)
{
x=x*10+s[i];
t[i]=x/p;
x%=p;
}
if(!x)
{
for(x=1;t[x]==0;x++);x--;
n-=x;
for(i=1;i<=n;i++)s[i]=t[i+x];
return 1;
}
else return 0;
}
int main()
{
// freopen("test.in","r",stdin);
int i;
while(scanf("%s",s+1),s[1]!='-')
{
memset(bang,0,sizeof(bang));
if(!s[2])
{
printf("1%c\n",s[1]);
continue;
}
n=strlen(s+1);
for(i=1;i<=n;i++)s[i]=s[i]-'0';
for(i=9;i>1;i--)
{
while(div(i))
{
bang[i]++;
}
}
if(n>1)printf("There is no such number.");
else for(i=2;i<=9;i++)while(bang[i]--)printf("%d",i);
puts("");
}
return 0;
}