【问题标题】:Print first 100000 Prime numbers in Java [duplicate]在Java中打印前100000个素数[重复]
【发布时间】:2021-08-04 16:10:39
【问题描述】:

我试图用 Java 构建一个简单的程序来打印前 N 个素数。

这是我的程序,在输入 N=10000 之前它工作正常,但是如果我们将输入增加到 N=100000,它会进入一个连续循环并花费大量时间。我尝试对其进行更多优化,以便它可以在输入 N=100000 时正常工作,但运气不佳。您能否建议我们是否可以优化代码以使其适用于较大的输入?

public class PrintPrimes {
public static void main(String[] args) {
    Scanner s = new Scanner(System.in);  //it will take input
    int n = s.nextInt();
    int number = 3;
    System.out.print("2" + " ");
    while (n > 1) {
        if (checkPrime(number)) {
            System.out.print(number + " ");
            n--;
        }
        number++;
    }
  }

public static boolean checkPrime(int number) {
    for (int i = 2; i <= number / 2; i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
  }
}

感谢您的帮助,谢谢!

【问题讨论】:

  • 你可以实现一个Sieve of Eratosthenes
  • 您在这里实现的方法是臭名昭著的Trial Division。我说臭名昭著是因为程序员经常错误地认为它是 Eratosthenes 的筛子,或者实际上与它相同。然而,真正的埃拉托色尼筛算法没有除法,而且 Big-O 复杂度要小得多,因此运行速度要快得多。
  • 你的 int 无声地溢出。切换到长。
  • 对于 N=100000,它在我的笔记本上运行大约 2 分钟。但是,我用.println 替换了.print - 我怀疑在一行中累积100000 个结果会占用大量内存和CPU 进行缓冲。

标签: java algorithm


【解决方案1】:

您可以使用Sieve of Eratosthenes

int n = s.nextInt();
boolean[] prime = new boolean[n + 1];
Arrays.fill(prime, true);
for(int i = 2; i * i <= n; i++){
    if(prime[i]){
        for(int j = i * i; j <= n; j += i){
            prime[j] = false;
        }
    }
}
for(int i = 2; i <= n; i++){
    if(prime[i]) System.out.print(i + " ");
}

【讨论】:

  • 您好,感谢分享,Eratosthenes 的筛子解决了我的问题。但是,我认为上述程序没有给出预期的结果。顺便感谢您的帮助。
  • @PrashantBalotra 它给出了什么出乎意料的输出?
  • 嗨@Unmitigated,实际上它工作正常,但我期待如果我们输入 100000 它将打印前 100000 个素数,但根据检查我猜这是打印最高 100000 的素数(即小于 100000 的素数)。但这也很棒。我会做剩下的部分并且已经接受了解决方案,谢谢!
猜你喜欢
  • 2016-02-16
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2013-03-26
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多