UVa 993:Product of digits2014-10-31 csdn shuangde800【链接】http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=934【原题】For a given non-negative integer number N , find the minimal natural Q such that the product of all digits of Q is equal N .
Input
The first line of input contains one positive integer number, which is the number of data sets. Each subsequent line contains one data set which consists of one non-negative integer number N (0

N

109) .
Output
For each data set, write one line containing the corresponding natural number Q or `-1" if Q does not exist.
Sample Input
3 1 10 123456789
Sample Output
1 25 -1
【题目大意】product: 乘积输入一个非负数N,找到一个最小的自然数Q,使得Q上的每一位数相乘的结果等于N【分析与总结】容易想到的是用搜索来做。在搜索之前需要做些剪枝的处理:找到所有能被N整除的数(N的约数),只有这些数才能构成最终答案。本栏目更多精彩内容:http://www.bianceng.cn/Programming/sjjg/然后就是按照答案Q的长度进行迭代加深搜索,Q的长度从1~10。有一点需要注意的地方:最高位数不能是1!【代码】
/** UVa:993 - Product of digits* Result: Accept* Time: 0.008s* Author: D_Double*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;bool vis[10];int fact[10], nIndex, cur, N;int number[10];bool flag;void dfs(int cur, int sum, int max){if(cur >= max){if(sum==N) flag=true;return ;}if(sum > N) return;if(flag) return;for(int i=0; i<nIndex; ++i){if(cur==0&&i==0&&fact[i]==1) continue;// 注意,最高位不能是1,因为乘1没意义而且使结果大10倍number[cur] = fact[i];dfs(cur+1, sum*number[cur], max);if(flag) return;}}int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&N);if(N<10) {printf("%d
", N);continue;}memset(vis, false, sizeof(vis));nIndex = 0;for(int i=1; i<=9; ++i) if(N%i==0)fact[nIndex++] = i;flag = false;int i;for(i=2; i<=10; ++i){dfs(0, 1, i);if(flag) break;}if(flag) {for(int j=0; j<i; ++j) printf("%d", number[j]);printf("
");}elseprintf("-1
");}return 0;}