描述: 给定一个整数M,求一个最小的整数N满足N每位数的乘积等于M。(M的位数不超过1000)
若不存在这样的整数N,则输出"There is no such number.",最后以输入M=-1结束;
思路:贪心+高精度
Sample Input
0 1 4 7 18 49 51 768 -1
Sample Output
10 11 14 17 29 77 There is no such number. 2688
实现代码:
#include<cstdio>
#define N 1010
char a[N];
int z[8];
int length;
bool div(int d)
{
int z=0;
int j=0;
char tmp[N];
for(int i=0;i<length;i++)
{
int x=a[i]+z*10;
int y=x/d;
z=x%d;
if(y||j)tmp[j++]=y;
}
if(z)return false;
for(int i=0;i<j;i++)a[i]=tmp[i];
length=j;
return true;
}
int main()
{
while(scanf("%s",&a)&&!(a[0]=='-'&&a[1]=='1'&&a[2]=='\0'))
{
for(length=0;a[length];length++)a[length]-='0';
if(length==1)
{
printf("1%d\n",a[0]);
continue;
}
for(int i=9;i>1;i--)
{
z[i-2]=0;
while(div(i))z[i-2]++;
}
if(length!=1)
{
printf("There is no such number.\n");
continue;
}
for(int i=2;i<10;i++)
{
while(z[i-2])
{
printf("%d",i);
z[i-2]--;
}
}
printf("\n");
}
return 0;
}