zoukankan      html  css  js  c++  java
  • 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 (0$ le$N$ le$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
    

     

    题意: 给定一个整数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);
    	    continue;
    	}
    	for (int i = 2; i <= 7; i ++) {//分解质因数枚举到7就可以了。因为一个位数上的数字必须是一位数。
    	    while (n % i == 0 && n != i) {
    		num[i] ++;
    		n /= i;
    	    }
    	}
    	if (n > 9)
    	    printf("-1
    ");
    	else {
    	    num[n] ++;
    	    solve();
    	    for (int i = 2; i <= 9; i ++) {//按从小到大输出。
    		while (num[i]) {
    		    printf("%d", i);
    		    num[i] --;
    		}
    	    }
    	    printf("
    ");
    	}
        }
        return 0;
    }


  • 相关阅读:
    原代码,反码,解释和具体的补充 Java在&gt;&gt;和&gt;&gt;&gt;差异
    开源 自由 java CMS
    Socket方法LAN多线程文件传输
    《》猿从程序书评项目经理-猿自办节目
    今年,我开始在路上
    mysql 拒绝访问的解决办法
    Mysql连接错误:Mysql Host is blocked because of many connection errors
    基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码
    【转】URL编码(encodeURIComponent和decodeURIComponent)
    oracle sql日期比较
  • 原文地址:https://www.cnblogs.com/james1207/p/3266509.html
Copyright © 2011-2022 走看看