viernes, 29 de marzo de 2013

Biblioteca Grandes Números C/C++

Una pequeña biblioteca en C/C++ (Comúnmente y mal conocida librería) que permite la suma y multiplicación de números con tantas cifras como se quiera. Los números se guardan en un array, guardando un dígito en cada una de sus componentes.

En la cabecera van unas breves instruciones:





/*BIBLIOTECA PARA OPERAR CON GRANDES NÚMEROS

INSTRUCCIONES:

En la posicion 0 del array se guarda su dimension.
Las cifras de indice menor, son las menos significativas. Ejemplo
A=002381;
A[0]=6; Dimesion
A[1]=0;
A[2]=0;
A[3]=2;
A[4]=3;
A[5]=8;
A[6]=1;

Los datos con los que se opera deben tener la misma longitud, es decir
A[0]=B[0]


*/

void multiplica(int A[], int B[], int C[]);
void suma(int A[], int B[], int C[]);
void Imprimir(int A[]);
void Leer(int A[]);

void multiplica(int A[], int B[], int C[])
{
    /*En C es donde se almacena la solucion*/
    int cont1,cont2,acarreo,aux,aux2;
    C[0]=A[0];
    
    for (cont1=A[0];cont1>=1;cont1--) C[cont1]=0;
    aux=0;
    
    for (cont1=A[0];cont1>=1;cont1--)
    {
        acarreo=0;
        for (cont2=A[0];cont2>=1;cont2--)
        {
            if ((cont2-aux)>0)
            {
                aux2=(C[cont2-aux]+A[cont1]*B[cont2]+acarreo)%10;
                acarreo=(C[cont2-aux]+A[cont1]*B[cont2]+acarreo)/10;
                C[cont2-aux]=aux2;
            }            
        }
        aux++;
    }
}
void suma(int A[], int B[], int C[])
{
    /*En C es donde se almacena la solucion*/
    int cont,acarreo;
    C[0]=A[0];
    for (cont=A[0];cont>=1;cont--) C[cont]=0;
    acarreo=0;
    for (cont=A[0];cont>=1;cont--)
    {
        C[cont]=(A[cont]+B[cont]+acarreo)%10;
        acarreo=(A[cont]+B[cont]+acarreo)/10;
    }
}

void Imprimir(int A[])
{
     int cont;
     for(cont=1;cont<=A[0];cont++) printf("%i",A[cont]);
}

void Leer(int A[], int Tam)
{
     int cont,aux;
     char c;
     
     A[0]=Tam;
     
     printf("Escriba el numero: ");/*Se puede quitar*/
     cont=0;
     scanf("%c",&c);
     while (c!='\n')
     {
         cont++;
         A[cont]=c-'0';
         scanf("%c",&c); 
     }
     aux=cont;
     for (cont=1;cont<=aux;cont++)/* printf("%i",A[cont]); printf("\n");*/
     for (cont=0;cont<aux;cont++)
     {
         A[Tam-cont]=A[aux-cont];
         A[aux-cont]=0;
     }
}
    

 
También les dejo una calculadora que usa ambas funciones mostrando la suma y la multiplicación: (cabe resaltar la necesidad de llamar a la biblioteca)


#include <stdio.h>
#include <grandes.h>
const int max=50;

int m[max+1],n[max+1],x[max+1];

int main(void)
{
    Leer(m,max);
    Leer(n,max);
    
    suma(m,n,x);
    printf("\n\nLa suma vale: "); Imprimir(x);
    
    multiplica(m,n,x);
    printf("\n\nLa multiplicacion vale: "); Imprimir(x);
    
    scanf("%i");
    return 0;
}

Por si lo necesitan, aquí les dejo el post donde se explica cómo se crean y se guardan las bibliotecas en C:
http://cypascal.blogspot.com.es/2012/11/crea-tu-propia-biblioteca-en-cc.html

Un saludo.


  
   
   
   


No hay comentarios:

Publicar un comentario