uva 993 Product of digits (贪心 + 分解因子)

 

  Product of digits 

 

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 (0N109) .

 

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

 

题意: 给定一个整数N。。要求出一个最小的Q。。使得Q的每位的乘积等于N。。

思路:贪心。。先把N分解成质因数保存起来。。。然后拿这些质因数去组合。。由于Q要最小。所以先使得位数尽量小。再使得每个位数上的数字尽量小。。就是答案了。。因此我们在组合的时候。要尽量往大了去组合。由于只能组合成一位数。所以从9开始组合。9需要2个3,8需要3个2,6需要2和3。4需要2个2组合。。按9, 8, 6, 4的顺序组合。。最后剩下的数字一定最少。然后在组合后每个数字的个数,按从小到大输出即可。。

..然后看了别人的题解。。。才发现。。其实直接从9开始分解因子就可以了。。我还先分解成质因子了在去组合- - 2B了。没考虑清楚就直接开始写的后果。。还好这题写的还不算太长

 

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <limits.h>

#include <algorithm>

using namespace std;



int t, n;

int num[10];



int solve() {//质因数去组合。。

    num[9] += num[3] / 2;

    num[3] %= 2;

    num[8] += num[2] / 3;

    num[2] %= 3;

    int sb = min(num[2], num[3]);

    num[6] += sb;

    num[2] -= sb;

    num[3] -= sb;

    num[4] += num[2] / 2;

    num[2] %= 2;

}



int main() {

    scanf("%d", &t);

    while (t --) {

	scanf("%d", &n);

	memset(num, 0, sizeof(num));

	if (n == 0 || n == 1) {//0和1单独出来考虑。

	    printf("%d\n", n);

	    continue;

	}

	for (int i = 2; i <= 7; i ++) {//分解质因数枚举到7就可以了。因为一个位数上的数字必须是一位数。

	    while (n % i == 0 && n != i) {

		num[i] ++;

		n /= i;

	    }

	}

	if (n > 9)

	    printf("-1\n");

	else {

	    num[n] ++;

	    solve();

	    for (int i = 2; i <= 9; i ++) {//按从小到大输出。

		while (num[i]) {

		    printf("%d", i);

		    num[i] --;

		}

	    }

	    printf("\n");

	}

    }

    return 0;

}


 

 

你可能感兴趣的:(git)