【问题标题】:What is the largest prime factor of the number 600851475143(Java)? What could be my mistake?数字 600851475143(Java)的最大质因数是多少?我的错误可能是什么?
【发布时间】:2021-01-20 06:43:50
【问题描述】:

代码对于 int 数据类型工作得很好,但 600851475143 似乎是一个太大的数字。我怎样才能让它工作?它一直在运行,从不给我答案。

public class Main {
    public static void main(String[] args) {
       long a = 600851475143L;
        boolean prime = false;
        long big = 0L;
        for (long i = 1L; i < a; i++){
            if (a % i == 0){
                for (int j = 2; j < i/(float)2; j++){
                    if (i % j == 0){
                        prime = true;
                        break;
                    }
                }
                if(!prime){
                    big = i;
                }
            }
        }
        System.out.println(big);
    }
}

【问题讨论】:

  • 将此if (i % 1000_000 == 0) System.out.println(i); 放在for 循环的顶部
  • break; 也只是突破了当前的for 并且prime 没有被重置,它似乎什么也没做。
  • 这是 Project Euler 问题 #3。如果您搜索它,您应该会找到一些帮助。

标签: java primes long-integer


【解决方案1】:

您还需要为j 使用long

您的变量命名也有点误导:prime 当数字不是素数时为真...

【讨论】:

  • 这看起来像是一个有用的评论......但不像一个答案。
【解决方案2】:

您的代码有很多问题。我的第一个建议是使用命名变量编写干净简洁的代码。其次,分析程序的运行时复杂性,即使它对大输入运行速度很快。您在 if(a % i == 0) 条件内运行内部循环这一事实使您的程序效率极低。

在这里,我提供了代码的重构版本,其中考虑了运行时复杂性和良好的变量名称:

  public static void main(String[] args) {
    System.out.println(largestPrimeFactorOf(600851475143L));
  }

  public static long largestPrimeFactorOf(long input)
  {
    List<Long> factors = new ArrayList<>();
    // You start from 2, as 1 is not a prime number and also using 1 will cause an infinite loop
    for (long i = 2L; i < input; i++) {
      if (input % i == 0) {
        factors.add(i);
        while (input % i == 0) {
          input /= i;
        }
      }
    }

    // As we always add a bigger number to the factor list, the last element is the greatest factor.
    return factors.get(factors.size() - 1);
  }

表示当输入是一个大素数时,这个程序仍然会很慢,例如100000000019. 为了有效地处理此类情况,最好使用有效的素数测试算法。你可以在网上搜索一下。 https://en.wikipedia.org/wiki/Primality_test

【讨论】:

  • 很有帮助。我的大部分代码效率低下,我几乎是在一月份才开始,但这个网站似乎是一个很好的资源来帮助解决这个问题。我刚刚尝试用我目前所学的 Java 解决问题,所以你使用的一些代码是新的,我还无法理解。
  • 这可能是一个愚蠢的问题,但是这部分代码是做什么的呢? List 因素 = 新的 ArrayList();
  • 代码List&lt;Long&gt; factors = new ArrayList&lt;&gt;(); 将用空的List 初始化factors。有很多关于 Java 的泛型和集合的好教程了解详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2013-06-25
  • 2020-12-19
相关资源
最近更新 更多