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;
}
}