【LeetCode - 625】最小因式分解

1、题目描述

在这里插入图片描述

2、解题思路

  本题考的是数学。

  给定任意一个数字 a,如果存在题意要求的 b,那么,这个 b 从左到右肯定是单调不减的。

  如果输入的数字是一位的,则直接返回它本身。如果是两位数包括以上且是质数,返回 0。

  我们可以对问题进行拆分,先确定 b 的最低位,然后依次求高位。

  按照 b 从高到低的单调不减特点,先设 b 的最低为为 9 ,看 a 能不能被 9 整除,如果能,说明已经确定好了 b 的一个最低位。

  问题就变为:给定一个正整数 a/9 ,找出最小正整数 b,使得 b 的所有数位相乘恰好等于 a/9。

  下面用几个例子来说:上面的解法

  a = 189

  1、先看 a 能不能被 9 整除,发现可以,找到 b 的最低为 9;

  2、a 变为 a/9,即 21;

  3、看 21 能不能被 9 整除,发现不能,接着尝试 8、7、…,发现可以被 7 整除,于是 b 又确定一个 7,a 变为 3;

  4、看 a = 3 能不能被 7 整除(不能从 9 开始,因为 b 是单调不减的),发现可以被 3 整除

  5、于是结果就变为 b = 379.

3、解题代码

public class Solution {
    public int smallestFactorization(int a) {
        if (a <= 1) return a;
        long b = 0;
        long tmp = 1;   // 权值,1 表示个位,10表示十位,100表示百位
        // b 是单调不减的,假如上一位是除以 8 的,那下一位就得从 8 开始往下找
        for (int i = 9; i >= 2; i--) {  // 注意 i 不能取到 1,否则回死循环
            while (a % i == 0) {    // 能不能被 i 整除
                a /= i; // 找到一个可以整除 a 的 i,更新 a 为 a/i
                b = tmp * i + b;    // 新添新确定的位
                tmp *= 10;
            }
        }
        // 到最后如果 a 不为 1,说明此时的 a 肯定是质数
        return a == 1 && b <= Integer.MAX_VALUE ? (int) b : 0;
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值