质数(数论):任何一个合数都能分解为多个质数相乘(递归模拟)

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

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

更多数论题解请看:https://blog.youkuaiyun.com/djsbdbk/category_12916979.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12916979&sharerefer=PC&sharesource=djsbdbk&sharefrom=from_linkhttps://blog.youkuaiyun.com/djsbdbk/category_12916979.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12916979&sharerefer=PC&sharesource=djsbdbk&sharefrom=from_link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值