Работа с вероятными простыми числами Java BigInteger

StackOverflow https://stackoverflow.com/questions/1081133

  •  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 раза медленнее итеративной

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top