java - usando - saber si un numero es primo online
Cómo determinar si un número es primo (5)
Bien, mi problema es menos de cómo averiguar si un número es primordial, porque creo que lo descubrí, pero más de cómo hacerlo para que se muestre correctamente.
Aquí está mi código:
public static void main(String[] args) {
// Declare Variables
int randomNumbers = 0;
int sum = 0;
//Loop for number generation and print out numbers
System.out.print("The five random numbers are: ");
for (int i = 0; i <= 4; i++)
{
randomNumbers = (int)(Math.random()*20);
sum += randomNumbers;
if (i == 4) {
System.out.println("and " + randomNumbers + ".");
}
else {
System.out.print(randomNumbers + ", ");
}
}
//Display Sum
System.out.println("/nThe sum of these five numbers is " + sum + "./n");
//Determine if the sum is prime and display results
for(int p = 2; p < sum; p++) {
if(sum % p == 0)
System.out.println("The sum is not a prime number.");
else
System.out.println("The sum is a prime number.");
break;
}
}
}
Ahora mi problema es que si el número termina siendo algo así como 9, dirá que es un número primo, que no lo es. Creo que el problema es que el corte lo detiene después de un ciclo, por lo que no está incrementando la variable p, por lo que solo está probando dividir por 2 (creo). Pero si elimino el punto de ruptura, se imprimirá "La suma es / no es un número primo" en cada pasada hasta que salga del ciclo. No estoy seguro de qué hacer aquí.
Necesita almacenar si el número es primo o no en un booleano fuera del ciclo:
//Determine if the sum is prime and display results
boolean isPrime = true;
for(int p = 2; p < sum; p++) {
if(sum % p == 0){
isPrime = false;
break;
}
}
if(isPrime){
System.out.println("The sum is a prime number.");
} else {
System.out.println("The sum is not a prime number.");
}
Su método para encontrar si su número es primo es el método correcto. Para que no se imprima consistentemente si el número es primo o no, podría tener una variable externa, que representa si el número es primo o no.
Como
boolean prime = true;
for (int p = 2; p < sum; p++) {
if (sum % p == 0) {
prime = false;
break;
}
}
if (prime)
System.out.println("The sum is a prime number.");
else
System.out.println("The sum is not a prime number.");
Al hacer este método, el programa asumirá que el número es primo hasta que pruebe que está equivocado. Entonces, cuando descubre que no es primo, establece la variable en falso y sale del ciclo.
Luego, después de que termine el bucle, solo tiene que imprimir si el número fue o no el primero.
Una manera de hacer este ciclo más rápido es pasar de p = 2 a p = la raíz cuadrada de suma. Entonces, usando este método, tu ciclo for se verá así:
double sq = Math.sqrt((double)sum);
for (int p = 2; p < sq; p++) {
//Rest of code goes here
}
Espero que esto ayude
Tiene razón, actualmente sus pruebas de código se dividen en dos, y el comando de interrupción se detiene después de un ciclo.
Después de la primera vuelta de su ciclo (p == 2), la break
siempre detendrá el ciclo.
La reparación más rápida de tu código cambiará la parte del bucle así:
boolean isPrime=true;
for(int p = 2; p < sum; p++) {
if(sum % p == 0) {
isPrime=false;
System.out.println("The sum is not a prime number.");
break;
}
}
if (isPrime)
System.out.println("The sum is a prime number.");
Este código puede mejorarse para mayor eficiencia y elegancia del código.
Para mayor eficiencia, no necesita verificar la divisibilidad por todos los números menores que la suma, es suficiente para verificar todos los números más pequeños por la raíz cuadrada de la suma.
Para un mejor código, crea una función separada para probar si un número es primo.
Aquí hay un ejemplo que implementa ambos.
// tests if n is prime
public static boolean isPrime(int n) {
if (n<2) return false;
for(int p = 2; p < Math.sqrt(n); p++) {
if(n % p == 0) return false; // enough to find one devisor to show n is not a prime
}
return true; // no factors smaller than sqrt(n) were found
}
public static void main(String []args){
...
System.out.println("sum is "+ sum);
if (isPrime(sum))
System.out.println("The sum is a prime number.");
else
System.out.println("The sum is not a prime number.");
}
Se han publicado tantas respuestas que son correctas pero ninguna de ellas está optimizada. Es por eso que pensé compartir el código optimizado para determinar el número primo aquí contigo. Por favor, eche un vistazo al siguiente fragmento de código ...
private static boolean isPrime(int iNum) {
boolean bResult = true;
if (iNum <= 1 || iNum != 2 && iNum % 2 == 0) {
bResult = false;
} else {
int iSqrt = (int) Math.sqrt(iNum);
for (int i = 3; i < iSqrt; i += 2) {
if (iNum % i == 0) {
bResult = false;
break;
}
}
}
return bResult;
}
Beneficios del código anterior-:
- Funcionará para números negativos y 0 y 1 también.
- Ejecutará el ciclo for solo para números impares.
- Incrementará la variable
for
loop en 2 en lugar de 1. - Irá iterando el bucle
for
solo hasta la raíz cuadrada del número en lugar de hasta el número.
Explicación-:
He mencionado los cuatro puntos anteriores que explicaré uno por uno. El código debe escribirse apropiadamente para las entradas no válidas, en lugar de las entradas válidas . Las respuestas que se hayan escrito hasta ahora están restringidas al rango válido de entrada en el que número iNum >=2
.
Debemos ser conscientes de que solo los números impares pueden ser primos , Note-: 2 es el único primo. Por lo tanto, no debemos ejecutar bucle para números pares.
No debemos ejecutar bucle para los valores pares de su variable, ya que sabemos que solo los números pares se pueden dividir por número par. Ya he mencionado en el punto anterior que solo los números impares pueden ser primos, excepto 2 como pares. Por lo tanto, no es necesario ejecutar código dentro for
loop para valores pares de la variable i
in for
.
Deberíamos iterar for
bucle solo hasta la raíz cuadrada del número en lugar de hasta el número. Pocas de las respuestas han implementado este punto, pero aún así pensé mencionarlo aquí.
Pequeños números primos
Utilice la prueba de primalidad matemática Apache Commons , el método está relacionado con números primos en el rango de int
. Puedes encontrar el código fuente en GitHub .
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
// org.apache.commons.math3.primes.Primes
Primes.isPrime(2147483629);
Utiliza la prueba probabilística Miller-Rabin de tal manera que se garantiza un resultado: utiliza los primeros números primos como base sucesiva (ver Manual de criptografía aplicada por Menezes, tabla 4.1 / página 140).
Grandes números primos
Si busca números primos mayores que Integer.MAX_VALUE
:
Use
BigInteger#isProbablePrime(int certainty)
para verificar previamente el candidato principalDevuelve verdadero si este BigInteger es probablemente primo, falso si es definitivamente compuesto. Si la certeza es ≤ 0, se devuelve verdadero. Parámetros: certeza: una medida de la incertidumbre que la persona que llama está dispuesta a tolerar: si la llamada devuelve verdadero, la probabilidad de que este BigInteger sea superior excede (1 - 1/2 incertidumbre). El tiempo de ejecución de este método es proporcional al valor de este parámetro.
A continuación, use "Prueba de primalidad AKS" para verificar si el candidato es realmente primo.