Mostrar si un número es primo con Groovy

Los números primos son todos aquellos números que solo tienen dos divisores, el 1 y él mismo; por ejemplo, el número 31 es primo ya que solo se puede dividir por 1 y por 31. Este programa escrito en Groovy cuenta con las siguientes 4 características:

  1. Evalúa el número ingresado por el usuario.
  2. Nos muestra los divisores que tiene ese número.
  3. Nos muestra cuántos divisores tiene ese número.
  4. Nos muestra si un número es o no es primo.




def input = new Scanner(System.in)
def cont = 0, numero, lim = 0

print("Ingrese el numero que desea evaluar: ")
numero = input.nextLong()

println()
println("Numero ingresado:\t$numero")
print("$numero es divisible por:\t")
(1..numero).each { div ->
    if(numero % div == 0) {
        print("($div) ")
        cont++
        lim++
        if(lim == 10) {
            print("\n\t\t\t")
            lim = 0
        }
    }
}
println("Fin!!")

if(cont == 2) {
    println("Si es un numero primo, tiene $cont divisores!!")
} else {
    println("No es un numero primo, tiene $cont divisor(es)!!")
}

Groovy es influido por Python, Perl, Ruby y Smalltalk, hereda la sintaxis de Java y es 100% compatible con él. Aqui se puede observar lo limpia que es su sintaxis, menos verboso y con caracteristicas muy agradables.

Declarando variables e instanciando objeto Scanner():
def input = new Scanner(System.in)
def cont = 0, numero, lim = 0

En Groovy las variables se declaran con la palabra clave defen la segunda línea se declaran 3 variables pero sólo dos de ellas se inicializan con un valor de 0. Al ser un lenguaje de tipado tanto dinámico como estático, el tipo de cada variable puede ser omitido o incluido; por ejemplo, aquí se pudo haber definido las variables de forma estática con el tipo long o intlong cont = 0, numero, lim = 0

En la primera línea se crea la instancia del objeto Scanner() que representa la entrada de datos estándar para realizar la lectura de datos ingresados por el usuario y tal vez los que ya programan en Java van a notar que falta incluir la linea import java.util.Scanner, pero no es necesario ya que Groovy importa todas las clases en java.util.* por defecto. También de forma estática Scanner input = new Scanner(System.in)

Solicitando y leyendo datos por teclado:
print("Ingrese el numero que desea evaluar: ")
numero = input.nextLong()

En este fragmento de código el usuario interactúa directamente con el programa, la primera línea muestra un mensaje en pantalla indicando al usuario que ingrese un número; la segunda línea lee la información que es ingresada por el usuario usando el método .nextLong() y se almacena el valor en la variable numero.

Salto de línea y mostrando divisores:
println()
println("Numero ingresado:\t$numero")
print("$numero es divisible por:\t")

Este fragmento de código tan sencillo hace 3 cosas muy básicas. Primero, se produce un salto de línea con la función println() sin necesidad de usar el carácter de nueva línea «\n»; segundo, se muestra un mensaje en pantalla con el número ingresado por el usuario, la expresión $numero es conocida como interpolación de cadenas; tercero, se muestra un mensaje con una cadena que dice: «$numero es divisible por:\t», seguido por los divisores extraídos y mostrados por el método each { div -> }.

Método each { div -> }, iterando en un rango:
(1..numero).each { div ->
    if(numero % div == 0) {
        print("($div) ")
        cont++
        lim++
        if(lim == 10) {
            print("\n\t\t\t")
            lim = 0
        }
    }
}
println("Fin!!")

El método each {} es una función que recibe una Closure como único argumento, es un iterador que recorre secuencias de elementos como los rangos (1..N) y listas [..]. Este fragmento está compuesto por un rango que va desde 1 hasta numero e iteramos sobre él usando el método each { div -> },  la variable div en la Closure va a tomar cada número del rango conforme va iterando y es equivalente a escribir: for(div in 0..numero).



Al interior de la Closure hay 2 sentencias if() pero la segunda está anidada, la primera verifica si el residuo de numero modulo (%) div es igual a cero (0) e imprime el valor de div entre un juego de () e incrementa el valor de cont y lim en 1; el segundo if() verifica si lim vale 10, parte la lista de divisores con el carácter «\n», los alinea con 3 espacios tabulados «\t» y reinicia lim a 0. El resultado de este fragmento de código sería:

18624 es divisible por: (1) (2) (3) (4) (6) (8) (12) (16) (24) (32) 
                        (48) (64) (96) (97) (192) (194) (291) (388) (582) (776) 
                        (1164) (1552) (2328) (3104) (4656) (6208) (9312) (18624) Fin!!

Se puede observar que cuando el número de divisores llegan a 10 se divide la lista y se alinea a la anterior. La última línea de código imprime la palabra «Fin!!».

Última sentencia if(), ¿sera número primo?:
if(cont == 2) {
    println("Si es un numero primo, tiene $cont divisores!!")
} else {
    println("No es un numero primo, tiene $cont divisor(es)!!")
}

La última palabra la tiene este fragmento de código ya que evalúa si la variable cont vale 2 y dependiendo del resultado le informa al usuario que el número es o no es primo con sus respectivos divisores.

Al ejecutar el programa nos dará el siguiente resultado:

[fixedtorres@linuxero]$ groovy NumerosPrimos.groovy
Ingrese el numero que desea evaluar: 18624

Numero ingresado:	18624
18624 es divisible por: (1) (2) (3) (4) (6) (8) (12) (16) (24) (32) 
                        (48) (64) (96) (97) (192) (194) (291) (388) (582) (776) 
                        (1164) (1552) (2328) (3104) (4656) (6208) (9312) (18624) Fin!!
No es un numero primo, tiene 28 divisor(es)!!

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *