sdut3140 A*B(math)

题目:传送门

题目描述

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).

输出

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:\n",++K);
        if(n==0)
        {
            printf("10\n");
            continue;
        }
        else if(n==1)
        {
            printf("1\n");
            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\n");
            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("\n");
    }
    return 0;
}
 

 

posted @ 2015-03-06 17:23  人艰不拆_zmc  阅读(208)  评论(0编辑  收藏  举报