java - SPOJ 上的 PrimeNumber 生成器运行时错误

标签 java primes

我试图解决 PrimeNumber Generator SPOJ 上的问题。该代码在 SPOJ 上总是给出运行时错误,但在 ideone.com 上它工作正常。不知道是什么导致了这个问题。我尝试了 Scanner 和 BufferedReader 来读取输入。

import java.lang.*;
import java.io.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(r.readLine());
        while (t > 0) {
            String input = r.readLine();
            int N1 = Integer.parseInt(input.split(" ")[0]);
            int N2 = Integer.parseInt(input.split(" ")[1]);
            boolean isPrime[] = new boolean[N2 + 1];
            int count = 0;
            int primes[] = new int[N2 + 1];
            for (int i = 2; i <= N2; i++) {
                isPrime[i] = true;
            }
            for (int i = 2; i * i <= N2; i++) {
                if (isPrime[i]) {
                    for (int j = 2; i * j <= N2; j++) {
                        isPrime[i * j] = false;
                    }
                }
            }
            for (int i = 2; i <= N2; i++) {
                if (isPrime[i]) {
                    primes[count++] = i;
                }
            }
            for (int i = 2; i <= N2; i++) {
                isPrime[i] = true;
            }
            for (int i = 0; i < count; i++) {
                int p = primes[i];
                int s = N1 / p;
                s = s * p;
                for (int j = s; j <= N2; j = j + p) {
                    if (j < N1) {
                        continue;
                    }
                    isPrime[j - N1] = false;
                }
            }

            for (int i = 0; i < count; i++) {
                if (primes[i] >= N1 && primes[i] <= N2) {
                    System.out.println(" " + primes[i]);
                }
            }
            for (int i = 0; i < (N2 - N1 + 1); i++) {
                if (isPrime[i] == true && (i + N1) != 1) {
                    System.out.println(i + N1);
                }
            }
            System.out.println("");
            t--;
        }
    }
}

我给出的示例输入是

2
10 30
50 100

我发现错误出现在 boolean isPrime[] = new boolean[N2 + 1] 行。 N2 不能取最大 1000000000 的值。

有人可以帮我解决这个问题吗?

最佳答案

您正在使用 boolean 数组:int primes[] = new int[N2 + 1]; 进行埃拉托斯特尼筛法。为了节省空间,请使用位而不是 boolean 值,例如 bitSet。为了节省更多空间,只记录奇数的答案,所有偶数(除2之外)都是合数,因此只要对2进行特殊安排就可以忽略它们;也许是这样的:

if (num % 2 == 0) { return num == 2; }

靠近 isPrime() 方法的开头。这将使所需的存储空间减半。

关于java - SPOJ 上的 PrimeNumber 生成器运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31863262/

相关文章:

java - 使用 Android 蓝牙 LE 示例应用程序获取当前值

java - 使用Google Guava获取List

c# - 找到给定数字以内的所有素数的最佳、性能最好的算法是什么?

javascript - 我最大的质数查找函数有什么问题?

java - 计算最多 N 个整数的素数

c++ - 打印从 1 到 100 的素数

java - 使用服务用户或公共(public)用户保护 REST 端点

java - 当 JComboBox 位于 JLayeredPane 中的 JFreeChart 上方时消失

java - 谷歌地图 GeoPoint 类失去精度

c - 高效素数函数