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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top