//Función suma (Quedará dentro de librería). Recibe los dos números a sumar así como su longitud
unsigned int* suma(unsigned char num1[], short len1, unsigned char num2[], short len2)
{
short count; //Variable para contador
unsigned char *res = NULL, *oldres = NULL; //Array del resultado
unsigned int *sav = NULL, z = 0;// Array que se devuelve con el return
unsigned int baselen = (len1 > len2) ? len1+1 : len2+1; //Longitud del resultado
short dif1 = baselen - len1 , dif2 = baselen - len2, pos1, pos2; //Variables de control
//Reservamos espacio para arrays
//res = (char *)realloc(res, baselen);
res
= oldres
= (char *)malloc(baselen
);
for(count = 0; count < baselen; count++)
{
*(res+count) = 0; //Inicializamos el array del resultado a 0
}
//Barremos los números de la posición más alta del array a la menor
for(count = baselen-1; count >= 0; count--)
{
pos1 = (count)-dif1;
pos2 = (count)-dif2;
//Con los IF evitamos salirnos de los arrays mientras sumamos
if((pos2 < 0) && (pos1 < 0))
{
;
}
else if(pos1 < 0)
{
*(res+count) = *(res+count) + num2[pos2];
}
else if(pos2 < 0)
{
*(res+count) = *(res+count) + num1[pos1];
}
else
{
*(res+count) = *(res+count) + num1[pos1] + num2[pos2];
}
//IF para control de sumas mayores a 10
if(res[count] >= 10)
{
*(res+count-1) = (*(res+count)/10);
*(res+count) = *(res+count) - (*(res+count)/10)*10;
}
}
for(count = 0; count < baselen; count++) //Deteccion del numero de 0 de más que hay a la izquierda
{
if(*(res+count) == 0) // EJ: 01845 -> 1 cero de más
{ // _
z++;
}
else
{
break;
}
}
if(z != 0) //Eliminación de los ceros y redireccion de memoria con el nuevo array
{
baselen = baselen-z; //EJ: 01845 -> 1845
for(count = z; count < baselen+z; count++)
{
*(res+count-z) = *(oldres+count);
}
//free(oldres); ->>> Esta línea es necesaria?? <<<-------------------------------------------------
}
//for(count = 0; count < baselen; count ++){printf("%d", *(res+count));}puts("");
sav = &res; //Creamos un array que devolveremos con los datos :
*(sav+1) = baselen; //1.- Longitud del array del resultado 2.- Puntero al resultado
return sav; //Devolvemos array [*Resultado, longitud]
}