LeetCode 2507. 使用质因数之和替换后可以取到的最小值

原题链接: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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理论!都是理论

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值