题意:我们可以把一个数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; }
时间: 2024-11-07 08:00:45