1 条题解
-
0
题意分析
题目要求:给定一个数字(可能非常大,最多位),找到最小的整数,使得该整数的各位数字乘积等于给定的数字。如果不存在这样的整数,输出提示信息。
例如:
- 输入 ,输出 ,因为 ,且 是最小的满足条件的数。
- 输入 ,输出
There is no such number.
,因为 无法分解为若干个一位数的乘积(,但 不是一位数)。
解题思路
-
输入处理:
- 读取输入的数字(可能非常大,用字符串存储)。
- 如果输入 ,程序结束。
-
特殊情况处理:
- 如果输入是一位数(如 、、...、),直接输出 加上该数字(如 、、...、),因为这些数字的各位乘积就是它本身。
-
分解因数:
- 将输入的大数分解为若干个一位数()的乘积,且要保证分解后的数字按非递减顺序排列,才能得到最小的整数。
- 采用贪心策略,从 到 尝试分解:
- 如果能被 整除,则分解出一个 ,并继续分解剩余部分。
- 如果不能,则尝试 ,依此类推,直到 。
- 如果最终剩余的部分不是 ,说明无法分解(如 的情况),输出
There is no such number.
。
-
构造最小数:
- 将分解得到的数字按升序排列(如 ),以保证最小。
##参考代码
#include<map> #include<stack> #include<cmath> #include<string> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; #define maxn 1100 #define ll long long char s[maxn]; int l,a[101010],b[101010],z[101010]; int f(int k) { int i,j=0,sum=0,x,y=0; for(i=0;i<l;i++) { sum=a[i]+y*10;//本位加上一位未除尽的数的余数 x=sum/k; y=sum%k; if(x!=0||j!=0) { b[j++]=x; } } if(y==0) { for(i=0;i<j;i++) a[i]=b[i]; l=j; return 1; } else return 0; } int main() { while(scanf("%s",s)!=EOF) { l=strlen(s); int i,j=0,k; if(l==2&&s[0]=='-'&&s[1]=='1') break; else if(l==1) { printf("1%s\n",s); } else { for(i=0;i<l;i++) { a[i]=s[i]-48; } k=9; while(k>=2) { if(f(k)!=0) { z[j++]=k; } else { k--; } } if(l==1) { for(i=j-1;i>=0;i--) printf("%d",z[i]); printf("\n"); } else printf("There is no such number.\n"); } } return 0; }
- 1
信息
- ID
- 1326
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者