【问题标题】:Largest prime factor - euler project最大素数——欧拉项目
【发布时间】:2014-07-16 04:17:12
【问题描述】:

我试图解决项目 Euler problem 3 是:

13195 的质因数是 5、7、13 和 29。 数字 600851475143 的最大质因数是多少?

这是我的解决方案,它适用于较小的值,但不知何故无法完成所需的数字:

public class Pro3 {
    public static void main(String[] args) {
        long l=600851475143L;
        for(long lo=l/2;lo>=2;lo--){
            if(l%lo==0 && isPrime(lo)==true){
                    System.out.println(lo);
                    break;
            }
        }
    }

    static boolean isPrime(long x){
        for(int i=2;i<=Math.sqrt(x);i++){
            if(x%i==0){
                return false;
            }

        }
        return true;
    }
}

【问题讨论】:

  • 那么到底发生了什么?
  • 我的程序一直在运行,没有任何输出或错误。
  • 它最终会在很长一段时间内完成。一千年之类的东西。所以在这方面,你的程序没有坏,只是效率低。
  • 此外,考虑优化您的 isPrime 代码以提高效率。建立一个已知素数的列表,而不是处理 2 以外的偶数,将显着提高后续 isPrime 调用的速度。

标签: java


【解决方案1】:

你可以试试这个方法

 public static List<Double> primeFactors(double numbers) {
    double n  = numbers;
    List<Double> factors = new ArrayList<>();
    for (int i = 2; i <= n / i; i++) {
        while (n % i == 0) {
            factors.add((double) i);
            n /= i;
        }
    }
    if (n > 1) {
        factors.add(n);
    }
    return factors;
}

public static void main(String[] args) {
   List<Double> result=primeFactors(600851475143d);
   System.out.println("largest prime factor is :" + result.get(result.size()-1));
}

输出:

largest prime factor is :6857.0

【讨论】:

  • 真的有必要找到两次素因数 - 第二次只是为了得到大小吗?此外,您的程序有一个错误 - primeFactors(16) 只会返回 2 一次,而不是四次,而且花费的时间也比必要的长。
  • 这行得通。谢谢。你能提供一个解释这个算法的链接吗?或者它有名字?
【解决方案2】:

lo 的起始值设置为Math.sqrt(l) + 1,将其更改为int,它应该可以正常工作,因为这正是我所做的。我能想到的最好的猜测是你的代码中的错误是使用 32 位 ALU 和整数溢出。

package page1;

import euler.Common;

/**
 * @author Obicere
 */
public class Euler003 {

    public static void main(final String[] args){
        long number = 600851475143L;
        int maxRange = (int) Math.sqrt(number) + 1;
        for(int i = maxRange; i >= 2; i--){
            if(number % i == 0 && Common.isPrime(i)){
                System.out.println(i);
                break;
            }
        }
    }

}

public static boolean isPrime(final int num) {
    if (num < 2) {
        return false;
    }
    if (num == 2) {
        return true;
    }
    for (int i = 2; i <= (int) Math.sqrt(num) + 1; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2014-03-08
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多