原题链接:LeetCode 2507. 使用质因数之和替换后可以取到的最小值
题目:
给你一个正整数 n
。
请你将 n
的值替换为n
的 质因数 之和,重复这一过程。
- 注意,如果 n 能够被某个质因数多次整除,则在求和时,应当包含这个质因数同样次数。
返回n
可以取到的最小值。
示例 1:
输入:n = 15
输出:5
解释:最开始,n = 15 。
15 = 3 * 5 ,所以 n 替换为 3 + 5 = 8 。
8 = 2 * 2 * 2 ,所以 n 替换为 2 + 2 + 2 = 6 。
6 = 2 * 3 ,所以 n 替换为 2 + 3 = 5 。
5 是 n 可以取到的最小值。
示例 2:
输入:n = 3
输出:3
解释:最开始,n = 3 。
3 是 n 可以取到的最小值。
提示:
2 <= n <= 105
题目解读:
- 将一个数分解为诺干质数,相加和如果不为质数则继续进行分解,直至最后分解的和不可再分解(即为质数)
题解:
- 代码解释
- work函数负责
- 1.找质数
- 2.循环分解该数,直至不能分解,res分解找到的质因数的和
- 主函数进行循环,
- int next = work(n); 返回循环分解后的和为 next
- if(next == n) break;如果最后相加和与原来的数相同,跳出循环,防止死循环
- n = next;继续分解 n=next,继续分解
代码:
C++
class Solution {
public:
int work(int n)
{
int res = 0;
for(int i = 2;i * i <= n;i++) // 找质数
{
if(n % i == 0)
{
while(n % i == 0) n /= i, res += i; // 循环分解该数,直至不能分解,res分解找到的质因数的和
}
}
if(n > 1) res += n; // 如果(n > 1),此处需要加上n,n为上述循环分解出的质数
// 模拟 15--> 3 n=5 退出循环
// res = 3 res=3 n > 1, res = 8;
return res;
}
int smallestValue(int n) {
while(true)
{
int next = work(n); // 返回循环分解后的和为 next
if(next == n) break; // 如果最后相加和与原来的数相同,跳出循环,防止死循环
n = next; // 继续分解 n=next,继续分解
}
return n;
}
};
Java
class Solution {
public int work(int n)
{
int res = 0;
for(int i = 2;i * i <= n;i++)
{
if(n % i == 0)
{
while(n % i == 0)
{
n = n / i;
res = res + i;
}
}
}
if(n > 1) res += n;
return res;
}
public int smallestValue(int n) {
while(true)
{
int next = work(n);
if(next == n) break;
n = next;
}
return n;
}
}