Mostrar si un número es primo con Go
Los números primos son todos aquellos números que solo tienen dos divisores, el 1 y él mismo; por ejemplo, el número 11 es primo ya que solo se puede dividir por 1 y por 11. Este programa escrito en Go cuenta con las siguientes 4 características:
- Evalúa el número ingresado por el usuario.
- Nos muestra los divisores que tiene ese número.
- Nos muestra cuántos divisores tiene ese número.
- Nos muestra si un número es o no es primo.
package main import "fmt" func main() { var numero, acum, lim int fmt.Print("Ingrese un numero: ") fmt.Scanf("%d", &numero) fmt.Println() fmt.Println("Numero ingresado:\t", numero) fmt.Print("Numero de divisores:\t") for div := 1; div <= numero; div++ { if numero % div == 0 { fmt.Print("[", div, "]") acum++ lim++ if lim == 10 { fmt.Printf("\n\t\t\t") lim = 0 } } } fmt.Println() if acum == 2 { fmt.Println("Cantidad de divisores:\t", acum) fmt.Println("¿Es un numero primo?:\t Si") } else { fmt.Println("Cantidad de divisores:\t", acum) fmt.Println("¿Es un numero primo?:\t No") } }
Sentencia package e import:
package main import "fmt"
En Go, siempre se debe usar la sentencia package seguida por el nombre del paquete; pero solo el paquete main es ejecutable y si le cambiamos el nombre, el programa no compila y si lo ejecutamos con el comando run, causamos un error en tiempo de ejecución con el siguiente mensaje: cannot run non-main package. La sentencia import nos permite importar paquetes al ámbito actual, en este caso importamos el paquete “fmt” para realizar operaciones de entrada y salida de datos.
Declarando variables, solicitando y leyendo datos:
var numero, acum, lim int fmt.Print("Ingrese un numero: ") fmt.Scanf("%d", &numero)
En la primera línea de este fragmento de código se usa la palabra clave var para declarar 3 variables de tipo int, en la tercera línea se usa la función Print() para mostrar en pantalla un mensaje solicitando el ingreso de un número y por último, en la cuarta línea se usa la función Scanf() para leer el valor ingresado por el usuario formateando los datos al estilo de C, el argumento “%d” indica que el dato leído será un número decimal.
Salto de línea, mostrando divisores y más:
fmt.Println() fmt.Println("Numero ingresado:\t", numero) fmt.Print("Numero de divisores:\t")
Este fragmento de código de solo 3 lineas es muy sencillo; la primera solo produce 1 salto de línea usando la función Println() sin el carácter de salto de línea “\n” explicitamente, la segunda línea le muestra el número ingresado por el usuario y la tercer línea solo muestra un mensaje con una cadena que dice: “Numero de divisores”, seguido por los divisores que son extraídos y mostrados por el bucle for().
Bucle for(), evaluando el número:
for div := 1; div <= numero; div++ { if numero % div == 0 { fmt.Print("[", div, "]") acum++ lim++ if lim == 10 { fmt.Printf("\n\t\t\t") lim = 0 } } } fmt.Println()
Una cosa antes de continuar, en Go los paréntesis no son necesarios ni son opcionales y esto ha hecho que las estructuras de control e iteración se sientan un poco más limpias. Una vez dicho esto entonces continuare.
El bucle for tiene una variable inicializada con un valor de 1 y se incrementa en 1 hasta que la variable div sea menor o igual que el valor de la variable numero. Al interior del bucle hay 2 sentencias if pero la segunda está anidada, la primera verifica si el residuo de numero módulo (%) div es igual a 0 e imprime div dentro de un juego de [] e irá incrementando el valor de acum y lim en 1.
El segundo if parte los divisores cuando llegan a 10 verificando que el valor de lim sea igual a 10 e imprime un salto de línea con el carácter de salto de linea “\n”, 3 espacios tabulados con el carácter “\t” y luego reinicia el valor de lim a 0. Al ejecutar el programa, el resultado de este fragmento de código es el siguiente:
Numero de divisores: [1][3][7][21][23][47][69][141][161][329] [483][987][1081][3243][7567][22701]
Se puede observar que se imprimen 10 divisores y la lista se parte alineándose a la anterior.
Última sentencia if, ¿es o no es número primo?:
if acum == 2 { fmt.Println("Cantidad de divisores:\t", acum) fmt.Println("¿Es un numero primo?:\t Si") } else { fmt.Println("Cantidad de divisores:\t", acum) fmt.Println("¿Es un numero primo?:\t No") }
Bien, esta última sentencia if le indicara al usuario si el numero es o no es primo comprobando que la variable acum sea igual a 2 mostrando la cantidad de divisores que se han encontrado en el bucle for anterior.
Al ejecutar el programa nos arroja el siguiente resultado:
[fixedtorres@linuxero]$ go run NumerosPrimos.go Ingrese un numero: 22701 Numero ingresado: 22701 Numero de divisores: [1][3][7][21][23][47][69][141][161][329] [483][987][1081][3243][7567][22701] Cantidad de divisores: 16 ¿Es un numero primo?: No