prime1 spoj生成两个数字之间的素数

时间:2013-10-09 05:14:47

标签: java

package primesieve1;

import java.io.InputStreamReader;
import java.util.Scanner;

public class Primesieve1 {

    public boolean[] sieveOfEratosthenes(int max){

    boolean[] primeno; //defaults to false
        primeno = new boolean[max];
    for(int i=2; i<max; i++ ){primeno[i]=true;}

    for(int i=2; i<Math.sqrt(max);i++){
        if(primeno[i] == true){
            //all multiples of i*i, except i, are not primeno
            for(int j = i + i; j<max; j=j+i){
                primeno[j]=false;
            }
        }

    }
    return primeno;
}

    public void printTrue(boolean[] arr){
    for(int i=0; i<arr.length; i++){
        if(arr[i]==true){
            System.out.print(i + ", ");
        }
    }
    }

    public static void main(String[] args) {

        System.out.println("enter limit");
        Scanner sc = new Scanner(new InputStreamReader(System.in));
     int a = sc.nextInt();
        boolean a1[];
        Primesieve1 obj = new Primesieve1();
        a1 = obj.sieveOfEratosthenes(a);

        obj.printTrue(a1);

    }
}

发出这个错误并不明白为什么 java.lang.OutOfMemoryError:Java堆空间

1 个答案:

答案 0 :(得分:0)

虽然我不是100%肯定我认为boolean []仍然使用每个条目约1个字节。 Max可能会变得非常大,所以即使增加JVM的内存也可能无法解决问题。 但是,你可以做的一件事是不使用布尔[]而是使用BitSet,这样你每个数字只能使用1位,因此你可以覆盖直到int的最大值。