java - 查找数字 600851475143 的最大质因数的更有效方法

标签 java math numbers primes prime-factoring

我试图找到数字 600851475143 的最大质因数,并通过下面的代码成功,但我知道这是一种残酷的方式,可能有更有效和优雅的方法来解决这个问题。但是,我无法立即想到任何问题,希望有人可以分享他们的解决方案并进行解释。

public class Solution {

    // find prime numbers
    ArrayList<Long> primelist = new ArrayList<>();

    ArrayList<Long> findPrime(Long num) {
        for (Long i = Long.valueOf(2); i <= num; i++) {
            if (num % i == 0) {
                primelist.add(i);
                num = num / i;
                if (num == 1) {
                    break;
                }
            }
        }
        System.out.println(primelist);
        return primelist;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        sol.findPrime(Long.valueOf(600851475143L)); // [71, 839, 1471, 6857]
    }
}

最佳答案

如果您尝试分解的数字是两个大素数的乘积,则分解的计算成本很高。但是,您的算法(正如您所观察到的)效率特别低。

<小时/>

以下是一些加快程序速度的简单方法:

  1. 不要使用Long进行计算。请改用long。您的代码将生成并垃圾收集大量 Long 对象。

  2. 当使用试除法对数字 n 进行因式分解时,当您到达 sqrt(n) 时,您可以停止寻找质因数。

  3. 找到质因数后,您可以通过将原始数字除以该因式,然后尝试对结果进行因式分解来加速因式分解。 (事实上​​,您已经在这样做了。)

(但与更复杂的算法相比,这只是“鸡饲料”。)

关于java - 查找数字 600851475143 的最大质因数的更有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156716/

相关文章:

javascript - 相对于点javascript放置对象

python - 在 python/numpy/scipy 中生成低差异准随机序列?

java - 为什么编译包含静态嵌套类的类会创建一个名为 "EnclosingClass$1"的新 .class 文件?

java - 如何在命令行中通过 Apache Ant 样式变量替换设置 tomcat 的上下文属性?

math - 找到给定任意 20 个点的交易量

r - 每当R中有0时如何填写前面的数字?

input - 值更新 : 'afterkeydown' for input type ="numeric" in Knockoutjs 2. 0

java - 如何在java中递归添加计数?

java - 尝试运行junit测试并收到以下错误: unreported exception Overflow; must be caught or declared to be thrown

java - 什么时候可以在 Java 中使用浮点类型进行货币计算?