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:

  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.




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

 

Add a Comment

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