题目读了好长时间,郁闷。
题意:给定一个数N,求一个数M,要求:将M的各个位的数相乘得到N,M最小。思路:用到高精度除法,将给定的数从9开始试除,接着试除8,7,6,5,4,3,2.若结果 N仍大于一位数,则说明N有大于10的质因子,否则,倒序输出试除到数。
关键在于一开始我没想到是倒着由大到小除,看了别人的解释才明白的。
代码如下
#include<stdio.h>
#include<string.h>
char s[1005];
char tmp[1005];
int div(int num)
{
int i,j,mod;
memset(tmp,0,sizeof(tmp));
for(i=0,j=0,mod=0;s[i]!='\0';i++,j++)
{
mod=mod*10+(s[i]-'0');
tmp[j]=mod/num+'0';
mod%=num;
}
tmp[j]='\0';
if(mod==0)
{
i=0;
while(tmp[i]=='0')
i++;
strcpy(s,tmp+i);
return 1;
}
else
return 0;
}
void main()
{
int ans[1005];
int i,j;
while(scanf("%s",s)!=EOF)
{
memset(ans,0,sizeof(ans));
if(s[0]=='-')
break;
if(s[1]=='\0')
{
printf("1%s\n",s);
continue;
}
j=0;
for(i=9;i>1;i--)
{
while(div(i))
{
ans[j++]=i;
}
}
if(strlen(s)>1)
printf("There is no such number.");
else
for(i=j-1;i>=0;i--)
printf("%d",ans[i]);
printf("\n");
memset(s,0,sizeof(s));
}
}