2014-01-06 2 views
0

Является ли кто-то способным объяснить, почему я получаю исключение из диапазона за пределами 50 000 номеров, тогда как для 40 000 номеров код работает нормально. Код представляет собой алгоритм Эратосфена для получения простых чисел.Индекс массива из границ (Seat of Eratosthenes)

public static void primeThree (int number) { 

long startTime = System.currentTimeMillis(); 
ArrayList<Integer> myList = new ArrayList<Integer>(); 

boolean[] p = new boolean[number + 1]; 

for(int i = 2; i < p.length; i++) { 
    p[i] = true; 
} 
for(int i = 2; i < p.length; i++) { 
    if (p[i] == true) { 
    myList.add(i); 
    for(int j = 2; j < p.length; j++) { 
     if ((i * j) < number) { 
     p[j * i] = false; //line number 99 
     } 
    } 
} 
} 
long endTime = System.currentTimeMillis(); 

System.err.print(endTime - startTime); //prints time taken 
System.out.println(myList.toString()); 

}

Вот описание ошибки:

java.lang.ArrayIndexOutOfBoundsException: -2147446155 на PrimeNumbers.primeThree (PrimeNumbers.java:99)

+3

'java.lang.ArrayIndexOutOfBoundsException: -2147446155' кричит целое переполнение на меня. –

+0

Было бы проще протестировать ваш код, если бы конечная фигурная скобка внутри разделов тегов и кодов (открытая и закрывающая фигурные скобки) была отклонена последовательно. – hobs

ответ

2

50000 * 50000 = 2,500,000,000, или 2,5 миллиарда. Максимальное целочисленное значение java - 2,147,483,647. Вы переполняете свое целочисленное значение. Попробуйте использовать long вместо int.

0
for(long j = i*2; j < p.length; j += i) 
    p[j] = false; 
0

Ошибка указывает вам точно; -2147446155

Вы никогда не должны падать отрицательно, не так ли? Значит, вы переполнились.

Переполнение означает, что вы используете слишком большие числа, чтобы соответствовать типу данных, который вы выбрали.

Вам нужно что-то вроде длинного, плавающего или двойного; int не может обрабатывать такие большие числа.

Читайте об ограничениях междунар:

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

Знайте свои инструменты.

Смежные вопросы