Introducción

Llega el turno del lenguaje de programación Go o GoLang para escribir el algoritmo que determine si un número es narcisista.

Número narcisista en Go

Si quieres conocer más sobre el tema, lee: algoritmo para calcular número narcisista.

Comprobar si es número narcisista en Go

De nuevo traigo una función para solucionar este ejercicio. Es la siguiente:

func esNarcisista(numero int) bool{
	numeroComoCadena := strconv.Itoa(numero)
	longitudDeNumero := len(numeroComoCadena)
	suma := 0
	for indice := 0; indice < longitudDeNumero; indice++{
		// Convertir carácter a entero
		cifraActual := numeroComoCadena[indice] - '0'
		
		/*
			Elevarlo al exponente dado por la longitud del número
			por cierto, se castea a float64 porque math.Pow necesita un float64
		*/
		elevado := math.Pow(float64(cifraActual), float64(longitudDeNumero))

		// Vamos sumando el resultado
		suma = suma + int(elevado)
	}

	// Finalmente comprobamos si el número es igual a la suma
	if suma == numero{
		return true
	}else{
		return false
	}
}

Usamos math.Pow para elevar números a una potencia, así como strconv.Itoa para convertir un entero a una cadena, y finalmente a len para determinar la longitud de una cadena.

Para convertir cada carácter del número a un entero le restamos ‘0’ a dicho carácter, eso nos dará su representación numérica en lugar de su representación en el código ASCII.

Implementación del algoritmo

La función recibe un entero y devuelve un booleano; así de fácil. Por lo tanto un código completo de su implementación podría ser este:

/*
    Determinar si un número es narcisista usando Go/Golang
    https://parzibyte.me/blog/
*/
package main

import(
	"fmt"
	"math"
	"strconv"
)
func main(){

	/*
		Aquí probamos un arreglo de números, la función está más abajo
	*/
	numeros := []int{1, 2, 3, 4, 153, 28, 11, 96, 407, 1634, 54748}
	for _, numero := range numeros{
		fmt.Printf("¿%d es narcisista? %t\n", numero, esNarcisista(numero)) 
	}
}

// Aquí la función
func esNarcisista(numero int) bool{
	numeroComoCadena := strconv.Itoa(numero)
	longitudDeNumero := len(numeroComoCadena)
	suma := 0
	for indice := 0; indice < longitudDeNumero; indice++{
		// Convertir carácter a entero
		cifraActual := numeroComoCadena[indice] - '0'
		
		/*
			Elevarlo al exponente dado por la longitud del número
			por cierto, se castea a float64 porque math.Pow necesita un float64
		*/
		elevado := math.Pow(float64(cifraActual), float64(longitudDeNumero))

		// Vamos sumando el resultado
		suma = suma + int(elevado)
	}

	// Finalmente comprobamos si el número es igual a la suma
	if suma == numero{
		return true
	}else{
		return false
	}
}

En este caso probamos todo un arreglo de números e imprimimos los resultados en pantalla. La salida se ve a continuación:

Ejecución del algoritmo en Go
Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya actualizado algún sistema o publicado un nuevo software. Facebook | X | Instagram | Telegram | También estoy a tus órdenes para cualquier contratación en mi página de contacto