Кроме алгоритмических проблем, узкие места, скорее всего, писать в System.out
потоке. Это трудоемкая задача, я думаю, вы должны оставить эту часть из цикла тестов. Чтобы быстро проверить это, просто закомментируйте (с соответствующим if
заявления):
int iterations=100000;
long time = System.nanoTime();
for(int i = 3; i < 100000; i += 2) { //notice: always use curly brackets!!!
isPrime(i);
}
long endTime = System.nanoTime();
System.out.println("Time to go through " + iterations + " iterations: " + (endTime>time?endTime-time:endTime+time));
//notice: nanoTime might turn around, resulting in smaller (negative) endTime value
Кроме того, ответ Томаса гораздо более подробный относительно System.out.print
вопроса, а также обеспечивает соответствующий подход конкатенации много строки.
Алгоритмические проблемы:
Если вы собираетесь с ситом Erastothenes подход, вы уже нашли все мелкие штрихи при поиске следующей. Поэтому вы должны хранить их, и вместо того, чтобы проверять каждое нечетное число> 5, вам нужно только проверить те, которые у вас уже есть.
Кроме того, в то же время, вы не должны проверять их все, а только те, которые меньше или равен квадратный корень из вашего номера:
//suppose we have a List<Integer> primeList (populated by previous execution loops)
// and Integer numberTested as the number under testing
for(int i=0; i<primeList.size();i++) {
if(numberTested%primeList.get(i)==0) {
//divider found, not prime
break;
}
if(primeList.get(i)>Math.sqrt(numberTested)) {
//still not found a divider -- we found a prime
primeList.add(numberTested);
break;
}
}
Каков проблема с этим? Math.sqrt
- дорогостоящая операция. Намного дороже, чем умножение ... Итак, если диапазон чисел разрешает (вы должны иметь это всегда в виду!), Мы можем использовать умножение, чтобы быстрее получить сравнение:
sqrt(a)>b === a*a>b
, учитывая, что и a, и b - целые положительные числа ,
Integer currentPrimeSquare = primeList.get(i)*primeList.get(i);
if(currentPrimeSquare>numberTested) {
//still not found a divider -- we found a prime
primeList.add(numberTested);
break;
}
Для дальнейшего настроить это, вы могли бы хранить квадраты простых чисел тоже - дал вам достаточно памяти ....
См. Соответствующий вопрос http://stackoverflow.com/questions/453793/which-is-the-fastest-algorithm-to-find-prime-numbers – user1929959
Найти числовое число ber of sqrt (MAX_INPUT) с симуляцией и тест на все простые числа от 2 до sqrt (MAX_INPUT). Но если вы ищете простое число в большом диапазоне, то просто доведите до MAX_INPUT. – nhahtdh
@nhahtdh Я знаю это решение, но могу ли я спросить, почему это помогает? – shohamh