1 条题解

  • 0
    @ 2025-4-18 10:21:00

    题意分析

    题目要求:给定一个数字(可能非常大,最多10001000位),找到最小的整数,使得该整数的各位数字乘积等于给定的数字。如果不存在这样的整数,输出提示信息。

    例如:

    • 输入 1818,输出 2929,因为 2×9=182 \times 9 = 18,且 2929 是最小的满足条件的数。
    • 输入 5151,输出 There is no such number.,因为 5151 无法分解为若干个一位数的乘积(51=3×1751 = 3 \times 17,但 1717 不是一位数)。

    解题思路

    1. 输入处理

      • 读取输入的数字(可能非常大,用字符串存储)。
      • 如果输入 1-1,程序结束。
    2. 特殊情况处理

      • 如果输入是一位数(如 0011、...、99),直接输出 11 加上该数字(如 10101111、...、1919),因为这些数字的各位乘积就是它本身。
    3. 分解因数

      • 将输入的大数分解为若干个一位数(292 \sim 9)的乘积,且要保证分解后的数字按非递减顺序排列,才能得到最小的整数。
      • 采用贪心策略,从 9922 尝试分解:
        • 如果能被 99 整除,则分解出一个 99,并继续分解剩余部分。
        • 如果不能,则尝试 88,依此类推,直到 22
      • 如果最终剩余的部分不是 11,说明无法分解(如 5151 的情况),输出 There is no such number.
    4. 构造最小数

      • 将分解得到的数字按升序排列(如 9,22,9299,2 \rightarrow 2,9 \rightarrow 29),以保证最小。

    ##参考代码

    #include<map>
    #include<stack>
    #include<cmath>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define maxn 1100
    #define ll long long
    char s[maxn];
    int l,a[101010],b[101010],z[101010];
    int f(int k)
    {
        int i,j=0,sum=0,x,y=0;
        for(i=0;i<l;i++)
        {
            sum=a[i]+y*10;//本位加上一位未除尽的数的余数
            x=sum/k;
            y=sum%k;
            if(x!=0||j!=0)
            {
                b[j++]=x;
            }
        }
        if(y==0)
        {
            for(i=0;i<j;i++)
                a[i]=b[i];
            l=j;
            return 1;
        }
        else
            return 0;
    }
    int main()
    {
        while(scanf("%s",s)!=EOF)
        {
            l=strlen(s);
            int i,j=0,k;
            if(l==2&&s[0]=='-'&&s[1]=='1')
                break;
           else if(l==1)
           {
               printf("1%s\n",s);
           }
           else
           {
               for(i=0;i<l;i++)
               {
                   a[i]=s[i]-48;
               }
               k=9;
               while(k>=2)
               {
                   if(f(k)!=0)
                   {
                       z[j++]=k;
                   }
                   else
                   {
                       k--;
                   }
               }
               if(l==1)
               {
                   for(i=j-1;i>=0;i--)
                    printf("%d",z[i]);
                   printf("\n");
               }
               else
                printf("There is no such number.\n");
           }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1326
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者