题目:
给你一个正整数 n 。
请你将 n 的值替换为 n 的 质因数 之和,重复这一过程。
- 注意,如果
n能够被某个质因数多次整除,则在求和时,应当包含这个质因数同样次数。
返回 **n **可以取到的最小值。
算法:
方法一:模拟
思路:模拟即可,注意这里是求“n”可以取到的最小值,当n不再收敛时就应该返回结果,比如n = 4 = 2 * 2,质因数之和还是4,此时就直接返回了,而不是继续求。
另外就是求质因数的方法。
func smallestValue(n int) int {
// 如果n是质数,直接返回
nCopy := n
// 不是质数,找到所有质因数,求和sum
sum := 0
for {
prime, ok := findPrime(n)
if !ok {
if sum == 0 {
return prime
} else {
sum = sum + prime
break
}
}
sum = sum + prime
n = n / prime
}
// 边界条件n = 4
if sum == nCopy {
return sum
}
return smallestValue(sum)
}
// 找到质因数了吗,找到了就返回,没找到就返回自己
func findPrime(x int) (int, bool) {
for i := 2; i * i <= x; i ++ {
if x % i == 0 {
return i, true
}
}
return x, false
}