Cambio de base

Andrés Ibáñez Núñez

Este programa cambia un número natural escrito en una base cualquiera a la base que se escoja.


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

int cambioadecimal(int, char*);
void cambioabase(int, int, char*);

int main() {
    
    int base1, base2, decimal;
    char numerobase1[256], numerobase2[256];
    
    printf("Hola de nuevo, humano. Sé que tienes por ahí algunos números que\nquieres cambiar de base. Para escribirlos usa dígitos del 0 al 9\ny letras del abecedario, según corresponda\n\n");
    
    printf("Escribe un número en cualquier base: ");
    scanf("%s", numerobase1);
    
    printf("Escribe la base del número que has introducido: ");
    scanf("%i", &base1);
    
    printf("¿A qué base quieres cambiar? ");
    scanf("%i", &base2);
    
    decimal = cambioadecimal(base1, numerobase1);
    
    cambioabase(base2, decimal, numerobase2);
    printf("\n\tTu número en la base %i es %s.\n\n", base2, numerobase2);
    return 0;
}

int cambioadecimal(int base, char* numero) {
    
    int len = strlen(numero), suma = 0, i;
    
    for (i = len-1; i >= 0; i--) {
        
        if ('0' <= numero[i] && numero[i] <= '9') {
            if (numero[i] - '0' >= base) {
                printf("\n\tNúmero mal escrito para esa base.\n\n");
                exit(0);
            }
            suma += (numero[i] - '0')*pow(base, len-i-1);
        }
        
        else if (('A' <= numero[i])&&(numero[i] <= 'Z')) {
            
            if (numero[i] - 'A' + 10 >= base) {
                printf("\n\tNúmero mal escrito para esa base.\n\n");
                exit(0);
            }
            suma += (numero[i] - 'A' + 10)*pow(base, len-i-1);
        }
        
        else if (('a' <= numero[i])&&(numero[i] <= 'z')) {
            if (numero[i] - 'a' + 10 >= base) {
                printf("\n\tNúmero mal escrito para esa base.\n\n");
                exit(0);
            }
            suma += (numero[i] - 'a' + 10)*pow(base, -(i-len+1));
        }
        
        else {
            printf("\n\tNúmero mal escrito para esa base.\n\n");
            exit(0);
        }
    }
    
    return suma;
    
}

void cambioabase(int base, int decimal, char* numero) {
    
    int numcifras=1, i;
    
    while (pow(base, numcifras)<=decimal) numcifras++;
    
    int array[numcifras+1];
    
    numero[numcifras] = '\0';
    
    for(i=0; i < numcifras; i++) {
        array[numcifras-i-1] = decimal%base;
        decimal = decimal/base;
    }
    
    for(i=0; i < numcifras; i++) {
        if (array[i]<10) numero[i] = '0' + array[i];
        else numero[i] = 'a' + array[i] - 10;
    }
}
Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s