█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

Envío 3869

Problema 0x32 - Sumar dos números muy grandes

  • Autor: bryancalisto
  • Fecha: 2021-04-18 17:18:55 UTC (Hace casi 3 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.004 s 13 KBi
#2
Correcto
0.005 s 16 KBi
#3
Correcto
0.003 s 1 KBi
#4
Correcto
0.004 s 2 KBi
#5
Correcto
0.003 s 1 KBi
#6
Correcto
0.003 s 1 KBi
#7
Correcto
0.003 s 3 KBi
#8
Correcto
0.003 s 1 KBi
#9
Correcto
0.005 s 19 KBi
#10
Correcto
0.004 s 13 KBi
#11
Correcto
0.005 s 1 KBi
#12
Correcto
0.004 s 2 KBi
#13
Correcto
0.004 s 1 KBi
#14
Correcto
0.003 s 1 KBi
#15
Correcto
0.003 s 1 KBi
#16
Correcto
0.005 s 1 KBi
#17
Correcto
0.003 s 1 KBi
#18
Correcto
0.004 s 5 KBi
#19
Correcto
0.004 s 16 KBi
#20
Correcto
0.004 s 8 KBi
#21
Correcto
0.003 s 1 KBi
#22
Correcto
0.004 s 1 KBi
#23
Correcto
0.004 s 1 KBi
#24
Correcto
0.005 s 31 KBi
#25
Correcto
0.006 s 1 KBi
#26
Correcto
0.007 s 11 KBi
#27
Correcto
0.004 s 16 KBi
#28
Correcto
0.004 s 1 KBi
#29
Correcto
0.006 s 2 KBi
#30
Correcto
0.005 s 2 KBi
#31
Correcto
0.007 s 1 KBi
#32
Correcto
0.004 s 1 KBi
#33
Correcto
0.006 s 2 KBi
#34
Correcto
0.006 s 2 KBi
#35
Correcto
0.004 s 1 KBi
#36
Correcto
0.006 s 5 KBi
#37
Correcto
0.005 s 3 KBi
#38
Correcto
0.005 s 16 KBi
Puntos totales: 100 / 100

Código

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

int main()
{
  char *input;
  int len1, len2, i, j, *num1, *num2, carry = 0, maxLen, minLen, *maxLenNum, *minLenNum;

  input = (char *)malloc(10002); // 2 bytes extra para '\n' y '\0'

  // NUMERO 1
  fgets(input, 10002, stdin);
  len1 = strlen(input) - 1;
  input[len1] = '\0'; // replace '\n'
  num1 = (int *)malloc(sizeof(int) * len1);
  for (i = 0; i < len1; i++)
  {
    num1[i] = input[i] - '0';
  }

  // NUMERO 2
  fgets(input, 10002, stdin);
  len2 = strlen(input) - 1;
  input[len2] = '\0'; // replace '\n'
  num2 = (int *)malloc(sizeof(int) * len2);
  for (i = 0; i < len2; i++)
  {
    num2[i] = input[i] - '0';
  }

  if (len1 == len2 || len1 > len2)
  {
    maxLen = len1;
    maxLenNum = num1;
    minLen = len2;
    minLenNum = num2;
  }
  else
  {
    maxLen = len2;
    maxLenNum = num2;
    minLen = len1;
    minLenNum = num1;
  }

  // if (len1 == 1)
  // {
  //   printf("%d\n", num1[0] + k);
  //   free(num1);
  //   free(input);
  //   return 0;
  // }

  // Hacemos la suma
  maxLenNum[maxLen - 1] += minLenNum[minLen - 1];

  if (maxLenNum[maxLen - 1] > 9)
  {
    carry = 1;
    maxLenNum[maxLen - 1] -= 10;
  }

  // printf("maxLen = %d, minLen = %d\n", maxLen, minLen);

  for (i = 0; i <= maxLen - 2; i++)
  {
    j = i + 2;
    maxLenNum[maxLen - j] += carry;
    // printf("j=%d\n", j);
    if (j <= minLen)
    {
      // printf("maxNum = %d, minNum = %d\n", maxLenNum[maxLen - j], minLenNum[minLen - j]);
      maxLenNum[maxLen - j] += minLenNum[minLen - j];
    }

    if (maxLenNum[maxLen - j] > 9)
    {
      carry = 1;
      maxLenNum[maxLen - j] -= 10;
    }
    else
    {
      carry = 0;
    }
  }

  if (carry == 1)
  {
    printf("1");
  }

  for (i = 0; i < maxLen; i++)
  {
    printf("%d", maxLenNum[i]);
  }

  printf("\n");

  free(num1);
  free(num2);
  free(input);
  return 0;
}