
将n进行分解,如果n是合数可以分解为质数与合数相乘,也一定可分解成多个质数相乘。任何一个合数都能分解成多个质数相乘。
知道这一点,我们就可以不断的对一个数进行除(前提是从小到大从2开始),首先一直除2,再一直除3,一直除4(不可能除4,因为一直除2过了),一直除5,一直除6(不可能因为2,3以除过)......,外层循环结束后将ans与n进行比较,如果不同则还需要进行递归,如果相同说明最终的值为质数或为4,返回这个数。
题目中有2个关键的变量,
第一个数输入的n,第二个是运行后要替换的数,又因为,n要进行后续的判断,不能改变,要创建一个替代的变量。
以n=15为例;tem=n=15;
15除2除不尽,15除3,能除,除了一次,tem为15/3=5,ans+3;tem再除3时除不尽了,i++;tem除4,除不尽,i++;tem除5能出尽,tem=5/5=1,ans=3+5等于8;tem不在大于1,外循环结束。
模拟题意,如果ans不等于传入数据n(即还可以再分解),再将ans作为一个新的n进行调用,进行新一轮的判断。如果ans等于传入数据n(即传入的数据n本就是不可分解的质数,或分解后再相加仍不变的4没必要再进行下一轮调用)。
只要时合数就能被分解,返回分解成质数相加的数,只有4和n为质数时才能相等(ans=n),否则进行再次递归,知道最后进行判断的ans是个质数或为4。
class Solution {
public int smallestValue(int n) {
int ans = 0; int tem=n;
for (int i = 2; tem > 1; i++) {
while (tem % i == 0) {
tem /= i;
ans += i;
}
}
return ans == n ? n : smallestValue(ans);
}
}
238

被折叠的 条评论
为什么被折叠?



