leetcode 625. Minimum Factorization

本文介绍了一种算法,用于找到一个最小的正整数,其各数字位相乘等于给定的正整数。通过从9到2迭代地除以输入数并检查余数来构造目标数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Given a positive integer a, find the smallest positive integer b whose multiplication of each digit equals to a.

If there is no answer or the answer is not fit in 32-bit signed integer, then return 0.

Example 1
Input:

48
Output:
68
Example 2
Input:

15
Output:
35

解题思路

简单描述一下题目,给定一个正整数,找到一个最小的正整数,使得该最小正整数的各位乘积等于上述给定的正整数,如果这个数超过32位int的表示范围,就返回0.

这题其实很简单的,但没做出来确实罪过。首先,各位的乘积,就表示不可能出现超过1位的数,然后考虑最小,如果数最小,那么就一定是小的数的乘积在前面,只需要从9开始不断地对原数做除法,迭代递减至2就可以了,这样就一定保证了最小的乘积在最前面,如果最后的余数大于9,那就证明不存在这样的解,直接return 0.
还有一点,从得到的乘积恢复成数的过程中,判断是不是int溢出其实很简单,在C++里定义一个long,可以存储大于INT_MAX的值,直接判断就OK。这个技巧可以用在很多类似的判断是否溢出的题目中。

class Solution {
public:
    int smallestFactorization(int a) {
        // absolutely an easy problem
        if(a<10)    return a;
        vector<int> result;
        for(int i = 9;i>1;--i) {
            while(a%i==0){
                a = a/i;
                result.push_back(i);
            }
        }
        if(a>10)return 0;
        long retVal = 0;
        for(int i = result.size()-1;i>=0;--i) {
            retVal = retVal*10+result[i];
            if(retVal>INT_MAX) return 0;
        }
        return retVal;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值