Работа с вероятными простыми числами Java BigInteger
-
22-08-2019 - |
Вопрос
Я хочу напечатать все простые числа между двумя числами.Это мой код:
package sphere;
import java.math.BigInteger;
import java.io.*;
class PrimeTest2 {
public static void main(String args[]) throws java.lang.Exception {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String s = r.readLine();
String [] splitted = s.split(" ");
BigInteger lower = new BigInteger(splitted[0]);
BigInteger upper = new BigInteger(splitted[1]);
int lowerAsInt = Integer.parseInt(splitted[0]);
int upperAsInt = Integer.parseInt(splitted[1]);
BigInteger intermediate = lower;
for (int i=lowerAsInt; i<upperAsInt; i++) {
intermediate = intermediate.nextProbablePrime();
System.out.println(intermediate);
}
}
}
Когда он запускается с 1 10, результат будет следующим:
2
3
5
7
11
13
17
19
23
Почему это не останавливается на 7?
Решение
Потому что в вашей программе указано время выполнения (от 1 до 9), которое не останавливается ниже 10.Вместо вашего цикла вы, вероятно, хотите:
BigIntegerupper = BigInteger.valueOf(upperAsInt);
while (intermediate.compareTo(upper) <= 0) {
System.out.println(intermediate);
intermediate = intermediate.nextProbablePrime();
}
Видите разницу?Ваш начинается с 1 и заканчивается на 9 (меньше 10), печатая число на каждой итерации.Приведенное выше действие прекращается, когда число превышает верхнюю границу.
Другие советы
У вас он настроен на запуск там, где (я<10), не останавливаться, когда значение простого числа больше 10
Вы увеличиваете i на единицу каждый раз, так что он будет выполняться от i = 1 до i = 10 (9 раз).если вы хотите, чтобы это прекратилось раньше, установите i = intermediate .
Вы считаете i
От lowerASInt
Для upperAsInt
.Вы считаете i от 1 до 10.Заявление i++
приращения i
с 1 (одним).
Итак, ваш цикл читает:в то время как i
меньше 10, выведите простое число и увеличьте i
с помощью 1.
Таким образом, вы получите первые 9 результатов.
Это работает, если вы используете JDK8
BigInteger lower=BigInteger.valueOf(1);
BigInteger high=BigInteger.valueOf(100);
Stream.iterate(lower, BigInteger::nextProbablePrime).limit(high.longValueExact())
.filter(p -> p.compareTo(high) <= 0).forEach(System.out::println);
Пожалуйста , не используйте parallel() для приведенного выше потока , так как это снизит производительность .Как правило, пожалуйста, не распараллеливайте stream, если у вас есть Stream.iterate() или Stream.limit() в вашем коде.Простой тест на моей виртуальной машине показывает, что параллельная версия в 4 раза медленнее итеративной