Advertisement
Miquel_Fuster

Adding very big numbers

Sep 17th, 2023
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char *sumar(char *n1, char *n2);
  6. void compactar(char *numero);
  7.  
  8. int main() {
  9.     char *ns1 = malloc(101);
  10.     char *ns2 = malloc(101);
  11.     char *res;
  12.    
  13.     printf("Introduce n1: ");
  14.     scanf("%100s", ns1);
  15.    
  16.     printf("Introduce n2: ");
  17.     scanf("%100s", ns2);
  18.    
  19.     res = sumar(ns1, ns2);
  20.    
  21.     free(ns1);
  22.     free(ns2);
  23.    
  24.     printf("\nEl resultado: %s", res);
  25.    
  26.     free(res);
  27. }
  28.  
  29. // Elimina los '0' de la izquierda.
  30. void compactar(char *numero) {
  31.     int i;
  32.    
  33.     // Busca el índice donde el número no tenga '0'
  34.     for(i = 0; numero && numero[i] == '0'; ++i);
  35.    
  36.     // Copia al inicio de la cadena a partir de la posición con
  37.     //   dígitos relevantes
  38.     if(i) {
  39.         memcpy(numero, numero + i, (strlen(numero) + 1 - i) * sizeof(char));
  40.     }
  41.    
  42.     return numero;
  43. }
  44.  
  45. char *sumar(char *n1, char *n2) {
  46.     int n1_ind, n2_ind, res_ind, res_len;
  47.     int digit_1, digit_2, digit_res;
  48.     int carry = 0;
  49.     char *res, *aux;
  50.    
  51.     compactar(n1);
  52.     compactar(n2);
  53.    
  54.     // Índices apuntan al último carácter.
  55.     n1_ind = strlen(n1) - 1;
  56.     n2_ind = strlen(n2) - 1;
  57.    
  58.     // La longitud del resultado sera un carácter mas grande que el
  59.     //   mayor numero, por si hay acarreo fina.l
  60.     res_len = (n1_ind > n2_ind? n1_ind : n2_ind) + 2;
  61.    
  62.     // Se aloja la cadena resultado.
  63.     res = malloc((res_len + 1) * sizeof(char));
  64.    
  65.     // Hacer la cadena imprimible.
  66.     res[res_len] = '\0';
  67.    
  68.     // Índice apunta al ultimo carácter.
  69.     res_ind = res_len - 1;
  70.    
  71.     // Suma los dos números desde el final hasta el principio. Si
  72.     //   uno de ellos se queda demasido corto con el otro su
  73.     //   dígito será 0.
  74.     while(n1_ind >= 0 || n2_ind >= 0) {
  75.         digit_1 = n1_ind >= 0? n1[n1_ind] - '0' : 0;
  76.         digit_2 = n2_ind >= 0? n2[n2_ind] - '0' : 0;
  77.         digit_res = digit_1 + digit_2 + carry;
  78.        
  79.         // Control del acarreo.
  80.         if(digit_res > 9) {
  81.             carry = 1;
  82.             digit_res %= 10;
  83.         } else {
  84.             carry = 0;
  85.         }
  86.        
  87.         // Posicionado del dígito resultado.
  88.         res[res_ind] = digit_res + '0';
  89.        
  90.         // Actualización de los índices.
  91.         --n1_ind;
  92.         --n2_ind;
  93.         --res_ind;
  94.     }
  95.    
  96.     // El primer dígito del resultado es el valor de acarreo.
  97.     res[res_ind] = carry + '0';
  98.    
  99.     compactar(res);
  100.    
  101.    
  102.     return res;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement