减少Java程序的执行时间

时间:2016-05-31 02:25:38

标签: java algorithm primes execution-time

我为项目Euler的第二个问题编写了以下程序,问题是:" Project Euler#3:最大的素因子"。它应该打印出所提供的所有最高素数因子输入。

import java.util.Scanner;
public class euler_2 {
    public static boolean isPrime(int n) {
        if (n % 2 == 0) return false;
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0)
                return false;
        }
        return true;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        for (int i = 0; i < a; i++) {
            int b = sc.nextInt();
            for (int j = b; j >= 1; j--) {
                boolean aa = isPrime(j);
                if (aa == true && b % j == 0) {
                    b = j;
                    break;
                }
            }
            System.out.println(b);
        }
    }
}

我可以对程序进行哪些更改以使其执行得更快?对于这个问题,什么是更好的算法?

2 个答案:

答案 0 :(得分:1)

尝试将数字分解为2个因子。重复到目前为止找到的最大因子,直到找到一个无法计算的因子 - 这是最大的素因子。

有许多不同的方法可以尝试对数字进行分解,但由于它们只是整数,因此Fermat的方法甚至试验区(从sqrt(N)开始)可能会这样做。见http://mathworld.wolfram.com/FermatsFactorizationMethod.html

答案 1 :(得分:1)

您的方法存在的问题是,对于每个数字N,您尝试的每个数字都小于或等于N是否为素数,之后是否为{{1}的除数}。

明显的改进是先检查它是否是一个除数,然后才能检验它是否为素数。但很可能这对此没什么帮助。

你可以做的只是开始检查每个数字是否是数字的除数。如果它是一个除数,除以它。你继续这个直到N

我很久没有对java做过任何事了,但这里是Go实现,很可能任何Java人都可以转换为Java。

sqrt(N)

使用我的算法,你需要O(sqrt(N))才能找到数字的最大素数。在您的情况下,它是func biggestPrime(n uint64) uint64 { p, i := uint64(1), uint64(0) for i = 2; i < uint64(math.Sqrt(float64(n))) + uint64(1); i++ { for n % i == 0 { n /= i p = i } } if n > 1 { p = n } return p }