【问题标题】:Decrease execution time of the Java program减少Java程序的执行时间
【发布时间】:2016-05-31 02:25:37
【问题描述】:

我为 Project Euler 的第二个问题编写了以下程序,针对问题:“Project Euler #3: Largest prime factor”。它应该打印出所提供输入的所有最高素因数。

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

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

【问题讨论】:

  • 你能告诉我们任何尝试吗?
  • @Leo 他的第一次尝试还不够吗?

标签: java algorithm primes execution-time


【解决方案1】:

您的方法的问题在于,对于每个数字 N,您尝试每个小于或等于 N 的数字是否是素数,然后是否是 N 的除数。

明显的改进是先检查它是否是一个除数,然后才检查它是否是一个素数。但很可能这不会有太大帮助。

您可以做的只是开始检查每个数字是否是数字的除数。如果是除数,则除以。你继续这个直到sqrt(N)

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

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
}

使用我的算法,你需要 O(sqrt(N)) 才能找到一个数的最大素数。在你的情况下是O(N * sqrt(N))

【讨论】:

    【解决方案2】:

    尝试将数字分解为 2 个因数。对迄今为止找到的最大因子重复,直到找到一个无法分解的因子——即最大的素因子。

    有许多不同的方法可以尝试对数字进行因式分解,但由于它们只是整数,那么 Fermat 方法甚至试除法(从 sqrt(N) 向下)可能都可以。见http://mathworld.wolfram.com/FermatsFactorizationMethod.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2021-07-09
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多