Trabajar con probable primo BigInteger de Java
-
22-08-2019 - |
Pregunta
Quiero imprimir todos los números primos entre dos números. Este es mi código:
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);
}
}
}
Cuando se ejecuta con 1 10 la salida es:
2
3
5
7
11
13
17
19
23
¿Por qué no se detiene en 7?
Solución
Debido a que su programa dice tiempos de ejecución (1 a 9) no se detienen por debajo de 10. En lugar de su bucle es probable que desee:
BigIntegerupper = BigInteger.valueOf(upperAsInt);
while (intermediate.compareTo(upper) <= 0) {
System.out.println(intermediate);
intermediate = intermediate.nextProbablePrime();
}
Vea la diferencia? Suyo comienza a 1 y se detiene en 9 (menos de 10), la impresión de un número en cada iteración. Los topes anteriores cuando el número es mayor que el límite superior.
Otros consejos
Lo tienes configurado para ejecutarse en donde (i <10), no se detenga cuando el valor de un número primo es mayor que 10
Se está incrementando i en uno cada vez, por lo que va a correr desde i = 1 hasta i = 10 (9 veces). si desea que se detenga conjunto anterior i = intermedio.
i
está contando a partir lowerASInt
a upperAsInt
. Usted está contando i de 1 a 10.
Los incrementos de declaración i++
i
con 1 (uno).
Así que su bucle lee:
mientras i
es inferior a 10, imprimir una i
primer y el incremento de 1.
Así obtendrá los primeros 9 resultados.
Esto funciona si se utiliza 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);
Por favor, no use paralelo () para la secuencia anterior, ya que se ralentizará el rendimiento. Como regla general por favor no paralelizar corriente si usted tiene Stream.iterate () o Stream.limit () en el código. Un punto de referencia simple en mi vm muestra la versión paralela es 4 veces más lento que el iterativo