-
-
Save parzibyte/8950fac0b73481bd411d0705ae01f7d1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Convierte un número decimal a cualquier base | |
* @param numeroDecimal El número en base 10 | |
* @param cadenaResultado Cadena en donde se almacenará el resultado, pues esta función no devuelve nada, solo coloca el resultado en la cadena indicada | |
* @param base La base a la que se desea convertir el número. Por ejemplo, para convertir a hexadecimal, la base es 16 | |
* @param digitos Los dígitos que conforman la base a la que se convierte el número. Por ejemplo, para la base 16 son 0123456798ABCDEF | |
* @author Parzibyte https://parzibyte.me/blog | |
*/ | |
void decimalACualquierBase(double numeroDecimal, char cadenaResultado[MAXIMA_LONGITUD_CADENA], const int base, const char digitos[]) | |
{ | |
/* | |
* Separar fracción y entero | |
* */ | |
double parteEnteraDouble; // Temporal para modf | |
double parteFraccionaria; | |
parteFraccionaria = modf(numeroDecimal, &parteEnteraDouble); | |
int parteEntera = (int)parteEnteraDouble; | |
/* | |
* Declarar cadenas | |
* */ | |
char cadenaParteEntera[MAXIMA_LONGITUD_CADENA] = ""; | |
char cadenaParteFraccionaria[MAXIMA_LONGITUD_CADENA] = ""; | |
// Realizar la conversión de la parte entera | |
while (parteEntera > 0) | |
{ | |
int residuo = parteEntera % base; | |
char digito = digitos[residuo]; | |
concatenarCharACadena(digito, cadenaParteEntera); | |
parteEntera /= base; | |
} | |
// Invertimos la cadena | |
invertirCadena(cadenaParteEntera); | |
// Realizar conversión de la parte fraccionaria | |
double sobrante; | |
do | |
{ | |
double resultado = parteFraccionaria * base; | |
parteFraccionaria = modf(resultado, &sobrante); | |
char digito = digitos[(int)sobrante]; | |
concatenarCharACadena(digito, cadenaParteFraccionaria); | |
} while (sobrante != 0); | |
// Concatenar finalmente la parte entera y fraccionaria en el resultado | |
strcpy(cadenaResultado, ""); // Limpiar cadena | |
strcat(cadenaResultado, cadenaParteEntera); | |
strcat(cadenaResultado, "."); | |
strcat(cadenaResultado, cadenaParteFraccionaria); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment