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