最大的素因 - 欧拉项目

时间:2014-07-16 04:17:12

标签: java

我试图解决项目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;
    }
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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