题目:传送门
题目描述
Your task is to find the minimal positive integer number Q so that the product of digits of Q is exactly equal to N.
输入
The first line of input contains T, number of test cases.
The following T lines each contain a single integer number N (0<=N<=2^31-1).
The following T lines each contain a single integer number N (0<=N<=2^31-1).
输出
For each test case, your program should first print to the output "Case #i:"(i is the case number) in one line, and then the number Q in the second line. If such a number does not exist print -1.
示例输入
1 10
示例输出
Case #1: 25
题意:求一个最小的正整数,使得该正整数的各位数字乘积等于N。(其中正整数这一条件是个坑,0不是正整数,如果输入n==0,则输出结果为10)
因为是各位乘积,所以这题一看就是要分解质因子,如果这个数存在超过10的质因子,则输出-1,否则就是搭配这些质因子使结果最小,因为存在质因子2,3,5,7,7与5只能单独
放在一位上(因为他与其它质因子作积都超过10),之后就是搭配2,3,首先尽可能的搭配两个三,三个2.......总之我就是分解完质因子后暴力做的。
官方解释:
i=9->2每次判断N%i是否等于0,如果等于0,则将9放在生成的数的最后一位。循环结束后判断N是否为1,如果不为1说明无解。举个例子,39=3*13,是无解的。有个特别坑的地方,就是N==0的时候答案是10,而不是0。为什么呢?因为0不是正整数啊~
还是官方解释的言简意赅,我做的有点麻烦,但是思想都是一样的,直接贴代码了!
#include <iostream> #include <algorithm> #include <math.h> #include <map> #include <queue> #include <stack> #define inf 0x3f3f3f3f #include <stdio.h> #include <string.h> typedef long long ll; #define mod 10000007 #define eps 1e-9 using namespace std; int n,ans[10100],num[10100],tt,c[10100],mm; int main() { int T,K=0,tt; scanf("%d",&T); while(T--) { scanf("%d",&n); tt=0; printf("Case #%d: ",++K); if(n==0) { printf("10 "); continue; } else if(n==1) { printf("1 "); continue; } memset(num,0,sizeof(num)); for(ll i=2;i*i<=n;i++) { if(n%i==0) { ans[tt]=i; num[tt]++; n/=i; while(n%i==0) { num[tt]++; n/=i; } tt++; } } if(n>1) { ans[tt]=n; num[tt++]++; } bool flag=false; for(int i=0;i<tt;i++) { if(ans[i]>9) { flag=true; break; } } if(flag) { printf("-1 "); continue; } mm=0; for(int i=tt-1;i>=0;i--) { if(ans[i]==7) { for(int j=1;j<=num[i];j++) c[mm++]=7; } else if(ans[i]<7) break; } for(int i=tt-1;i>=0;i--) { if(ans[i]==5) { for(int j=1;j<=num[i];j++) c[mm++]=5; } else if(ans[i]<5) break; } bool ff=false; bool yong=false; for(int i=0;i<tt;i++) { if(ans[i]==3) { if(num[i]%2==0) { while(num[i]) { c[mm++]=9; num[i]-=2; } } else { ff=true; while(num[i]>1) { c[mm++]=9; num[i]-=2; } } } else if(ans[i]>3) break; } if(ff&&ans[0]!=2) { c[mm++]=3; yong=true; } else if(!ff&&ans[0]==2) { while(num[0]) { if(num[0]>=3) { c[mm++]=8; num[0]-=3; } else if(num[0]>=2) { c[mm++]=4; num[0]-=2; } else { c[mm++]=2; num[0]-=1; } } } else if(ff&&ans[0]==2) { while(num[0]) { if(num[0]>=3) { c[mm++]=8; num[0]-=3; } else if(num[0]>=2) { if(!yong) { c[mm++]=6; num[0]-=1; yong=true; continue; } c[mm++]=4; num[0]-=2; } else { if(!yong) { yong=true; c[mm++]=6; num[0]-=1; continue; } c[mm++]=2; num[0]-=1; } } } if(!yong&&ff) c[mm++]=3; sort(c,c+mm); for(int i=0;i<mm;i++) { printf("%d",c[i]); } printf(" "); } return 0; }