zoukankan      html  css  js  c++  java
  • 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:
    ",++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;
    }
     
  • 相关阅读:
    C# List对象集合重组为新集合和获取某个字段组成新数组
    sqlserver xml for path html标签被转译问题
    高中信息技术(Python)重难点3:最大公约数
    高中信息技术(Python)重难点2:编码
    高中信息技术(Python)重难点1:数制
    天天快乐编程监考系统使用文档
    2021年OI集训队赛前模拟5题解
    2021年OI集训队赛前模拟4题解
    mysql-shell部署MGR
    GreatSQL手工部署mgr集群
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4318817.html
Copyright © 2011-2022 走看看