Suma de dos números grandes

Dados dos números como strings. Los números pueden ser muy grandes (pueden no caber en long long int), la tarea es encontrar la suma de estos dos números.

Ejemplos: 

Input  : str1 = "3333311111111111", 
         str2 =   "44422222221111"
Output : 3377733333332222

Input  : str1 = "7777555511111111", 
         str2 =    "3332222221111"
Output : 7780887733332222

La idea se basa en las matemáticas escolares. Atravesamos ambas strings desde el final, una por una agregamos dígitos y realizamos un seguimiento del acarreo. Para simplificar el proceso, hacemos lo siguiente: 
1) Invertir ambas strings. 
2) Continúe agregando dígitos uno por uno desde el índice 0 (en strings invertidas) hasta el final de la string más pequeña, agregue la suma % 10 al final del resultado y realice un seguimiento del acarreo como suma/10. 
3) Finalmente invertir el resultado. 

C++

// C++ program to find sum of two large numbers.
#include<bits/stdc++.h>
using namespace std;
 
// Function for finding sum of larger numbers
string findSum(string str1, string str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.length() > str2.length())
        swap(str1, str2);
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate length of both string
    int n1 = str1.length(), n2 = str2.length();
 
    // Reverse both of strings
    reverse(str1.begin(), str1.end());
    reverse(str2.begin(), str2.end());
 
    int carry = 0;
    for (int i=0; i<n1; i++)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        int sum = ((str1[i]-'0')+(str2[i]-'0')+carry);
        str.push_back(sum%10 + '0');
 
        // Calculate carry for next step
        carry = sum/10;
    }
 
    // Add remaining digits of larger number
    for (int i=n1; i<n2; i++)
    {
        int sum = ((str2[i]-'0')+carry);
        str.push_back(sum%10 + '0');
        carry = sum/10;
    }
 
    // Add remaining carry
    if (carry)
        str.push_back(carry+'0');
 
    // reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Driver code
int main()
{
    string str1 = "12";
    string str2 = "198111";
    cout << findSum(str1, str2);
    return 0;
}

Java

// Java program to find sum of two large numbers.
import java.util.*;
class GFG
{
// Function for finding sum of larger numbers
static String findSum(String str1, String str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.length() > str2.length()){
        String t = str1;
        str1 = str2;
        str2 = t;
    }
 
    // Take an empty String for storing result
    String str = "";
 
    // Calculate length of both String
    int n1 = str1.length(), n2 = str2.length();
 
    // Reverse both of Strings
    str1=new StringBuilder(str1).reverse().toString();
    str2=new StringBuilder(str2).reverse().toString();
 
    int carry = 0;
    for (int i = 0; i < n1; i++)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        int sum = ((int)(str1.charAt(i) - '0') +
                    (int)(str2.charAt(i) - '0') + carry);
        str += (char)(sum % 10 + '0');
 
        // Calculate carry for next step
        carry = sum / 10;
    }
 
    // Add remaining digits of larger number
    for (int i = n1; i < n2; i++)
    {
        int sum = ((int)(str2.charAt(i) - '0') + carry);
        str += (char)(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry > 0)
        str += (char)(carry + '0');
 
    // reverse resultant String
    str = new StringBuilder(str).reverse().toString();
 
    return str;
}
 
// Driver code
public static void main(String[] args)
{
    String str1 = "12";
    String str2 = "198111";
    System.out.println(findSum(str1, str2));
}
}
// This code is contributed by mits

Python3

# Python3 program to find sum of
# two large numbers.
 
# Function for finding sum of
# larger numbers
def findSum(str1, str2):
     
    # Before proceeding further,
    # make sure length of str2 is larger.
    if (len(str1) > len(str2)):
        t = str1;
        str1 = str2;
        str2 = t;
 
    # Take an empty string for
    # storing result
    str = "";
 
    # Calculate length of both string
    n1 = len(str1);
    n2 = len(str2);
 
    # Reverse both of strings
    str1 = str1[::-1];
    str2 = str2[::-1];
 
    carry = 0;
    for i in range(n1):
         
        # Do school mathematics, compute
        # sum of current digits and carry
        sum = ((ord(str1[i]) - 48) +
              ((ord(str2[i]) - 48) + carry));
        str += chr(sum % 10 + 48);
 
        # Calculate carry for next step
        carry = int(sum / 10);
 
    # Add remaining digits of larger number
    for i in range(n1, n2):
        sum = ((ord(str2[i]) - 48) + carry);
        str += chr(sum % 10 + 48);
        carry = (int)(sum / 10);
 
    # Add remaining carry
    if (carry):
        str += chr(carry + 48);
 
    # reverse resultant string
    str = str[::-1];
 
    return str;
 
# Driver code
str1 = "12";
str2 = "198111";
print(findSum(str1, str2));
 
# This code is contributed by mits

C#

// C# program to find sum of two large numbers.
using System;
class GFG
{
// Function for finding sum of larger numbers
static string findSum(string str1, string str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.Length > str2.Length){
        string t = str1;
        str1 = str2;
        str2 = t;
    }
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate length of both string
    int n1 = str1.Length, n2 = str2.Length;
 
    // Reverse both of strings
    char[] ch = str1.ToCharArray();
    Array.Reverse( ch );
    str1 = new string( ch );
    char[] ch1 = str2.ToCharArray();
    Array.Reverse( ch1 );
    str2 = new string( ch1 );
 
    int carry = 0;
    for (int i = 0; i < n1; i++)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        int sum = ((int)(str1[i] - '0') +
                (int)(str2[i] - '0') + carry);
        str += (char)(sum % 10 + '0');
 
        // Calculate carry for next step
        carry = sum/10;
    }
 
    // Add remaining digits of larger number
    for (int i = n1; i < n2; i++)
    {
        int sum = ((int)(str2[i] - '0') + carry);
        str += (char)(sum % 10 + '0');
        carry = sum/10;
    }
 
    // Add remaining carry
    if (carry > 0)
        str += (char)(carry + '0');
 
    // reverse resultant string
    char[] ch2 = str.ToCharArray();
    Array.Reverse( ch2 );
    str = new string( ch2 );
 
    return str;
}
 
// Driver code
static void Main()
{
    string str1 = "12";
    string str2 = "198111";
    Console.WriteLine(findSum(str1, str2));
}
}
 
// This code is contributed by mits

PHP

<?php
// PHP program to find sum of two large numbers.
 
 
// Function for finding sum of larger numbers
function findSum($str1, $str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (strlen($str1) > strlen($str2)) {
        $t=$str1;
        $str1=$str2;
        $str2=$t;
    }
 
    // Take an empty string for storing result
    $str = "";
 
    // Calculate length of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
 
    // Reverse both of strings
    $str1 = strrev($str1);
    $str2 = strrev($str2);
 
    $carry = 0;
    for ($i=0; $i<$n1; $i++)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        $sum = ((ord($str1[$i])-48)+((ord($str2[$i])-48)+$carry));
        $str.=chr($sum%10 + 48);
 
        // Calculate carry for next step
        $carry = (int)($sum/10);
    }
 
    // Add remaining digits of larger number
    for ($i=$n1; $i<$n2; $i++)
    {
        $sum = ((ord($str2[$i])-48)+$carry);
        $str.=chr($sum%10 + 48);
        $carry = (int)($sum/10);
    }
 
    // Add remaining carry
    if ($carry)
        $str.=chr($carry+48);
 
    // reverse resultant string
    $str=strrev($str);
 
    return $str;
}
 
// Driver code
  
    $str1 = "12";
    $str2 = "198111";
    echo findSum($str1, $str2);
 
// This code is contributed by mits
?>

Javascript

<script>
 
// Javascript program to find sum of
// two large numbers.
     
// Function for finding sum of larger numbers
function findSum(str1, str2)
{
     
    // Before proceeding further, make
    // sure length of str2 is larger.
    if (str1.length > str2.length)
    {
        let t = str1;
        str1 = str2;
        str2 = t;
    }
     
    // Take an empty String for storing result
    let str = "";
     
    // Calculate length of both String
    let n1 = str1.length, n2 = str2.length;
     
    // Reverse both of Strings
    str1 = str1.split("").reverse().join("");
    str2 = str2.split("").reverse().join("");
     
    let carry = 0;
    for(let i = 0; i < n1; i++)
    {
         
        // Do school mathematics, compute sum of
        // current digits and carry
        let sum = ((str1[i].charCodeAt(0) -
                        '0'.charCodeAt(0)) +
                   (str2[i].charCodeAt(0) -
                        '0'.charCodeAt(0)) + carry);
        str += String.fromCharCode(sum % 10 +
                        '0'.charCodeAt(0));
     
        // Calculate carry for next step
        carry = Math.floor(sum / 10);
    }
     
    // Add remaining digits of larger number
    for(let i = n1; i < n2; i++)
    {
        let sum = ((str2[i].charCodeAt(0) -
                        '0'.charCodeAt(0)) + carry);
        str += String.fromCharCode(sum % 10 +
                        '0'.charCodeAt(0));
        carry = Math.floor(sum / 10);
    }
     
    // Add remaining carry
    if (carry > 0)
        str += String.fromCharCode(carry +
                       '0'.charCodeAt(0));
     
    // reverse resultant String
    str = str.split("").reverse().join("");
     
    return str;
}
 
// Driver code
let str1 = "12";
let str2 = "198111";
 
document.write(findSum(str1, str2))
 
// This code is contributed by rag2127
 
</script>

Producción: 

198123

Complejidad de tiempo: O(n1+n2) donde n1 y n2 son longitudes de dos strings de entrada que representan números.

Espacio auxiliar: O(max(n1, n2))

Optimización: 
podemos evitar las dos primeras operaciones inversas de strings atravesándolas desde el final. A continuación se muestra la solución optimizada. 

C++

// C++ program to find sum of two large numbers.
#include<bits/stdc++.h>
using namespace std;
 
// Function for finding sum of larger numbers
string findSum(string str1, string str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.length() > str2.length())
        swap(str1, str2);
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate length of both string
    int n1 = str1.length(), n2 = str2.length();
    int diff = n2 - n1;
 
    // Initially take carry zero
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i=n1-1; i>=0; i--)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        int sum = ((str1[i]-'0') +
                   (str2[i+diff]-'0') +
                   carry);
        str.push_back(sum%10 + '0');
        carry = sum/10;
    }
 
    // Add remaining digits of str2[]
    for (int i=n2-n1-1; i>=0; i--)
    {
        int sum = ((str2[i]-'0')+carry);
        str.push_back(sum%10 + '0');
        carry = sum/10;
    }
 
    // Add remaining carry
    if (carry)
        str.push_back(carry+'0');
 
    // reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Driver code
int main()
{
    string str1 = "12";
    string str2 = "198111";
    cout << findSum(str1, str2);
    return 0;
}

Java

// Java program to find sum of two large numbers.
import java.util.*;
 
class GFG{
     
 // Function for finding sum of larger numbers
static String findSum(String str1, String str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.length() > str2.length()){
        String t = str1;
        str1 = str2;
        str2 = t;
    }
 
    // Take an empty String for storing result
    String str = "";
 
    // Calculate length of both String
    int n1 = str1.length(), n2 = str2.length();
    int diff = n2 - n1;
 
    // Initially take carry zero
    int carry = 0;
 
    // Traverse from end of both Strings
    for (int i = n1 - 1; i>=0; i--)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        int sum = ((int)(str1.charAt(i)-'0') +
            (int)(str2.charAt(i+diff)-'0') + carry);
        str += (char)(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining digits of str2[]
    for (int i = n2 - n1 - 1; i >= 0; i--)
    {
        int sum = ((int)(str2.charAt(i) - '0') + carry);
        str += (char)(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry > 0)
        str += (char)(carry + '0');
 
    // reverse resultant String
    return new StringBuilder(str).reverse().toString();
}
 
// Driver code
public static void main(String[] args)
{
    String str1 = "12";
    String str2 = "198111";
    System.out.println(findSum(str1, str2));
}
}
 
// This code is contributed by mits

Python3

# python 3 program to find sum of two large numbers.
  
# Function for finding sum of larger numbers
def findSum(str1, str2):
 
    # Before proceeding further, make sure length
    # of str2 is larger.
    if len(str1)> len(str2):
        temp = str1
        str1 = str2
        str2 = temp
  
    # Take an empty string for storing result
    str3 = ""
  
    # Calculate length of both string
    n1 = len(str1)
    n2 = len(str2)
    diff = n2 - n1
  
    # Initially take carry zero
    carry = 0
  
    # Traverse from end of both strings
    for i in range(n1-1,-1,-1):
     
        # Do school mathematics, compute sum of
        # current digits and carry
       
        sum = ((ord(str1[i])-ord('0')) +
                   int((ord(str2[i+diff])-ord('0'))) + carry)
      
        str3 = str3+str(sum%10 )
         
        
        carry = sum//10
  
    # Add remaining digits of str2[]
    for i in range(n2-n1-1,-1,-1):
     
        sum = ((ord(str2[i])-ord('0'))+carry)
        str3 = str3+str(sum%10 )
        carry = sum//10
  
    # Add remaining carry
    if (carry):
        str3+str(carry+'0')
  
    # reverse resultant string
    str3 = str3[::-1]
  
    return str3
  
# Driver code
if __name__ == "__main__":
    str1 = "12"
    str2 = "198111"
    print(findSum(str1, str2))
 
# This code is contributed by ChitraNayal

C#

// C# program to find sum of two large numbers.
using System;
 
class GFG{
     
// Function for finding sum of larger numbers
static string findSum(string str1, string str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.Length > str2.Length)
    {
        string t = str1;
        str1 = str2;
        str2 = t;
    }
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate length of both string
    int n1 = str1.Length, n2 = str2.Length;
    int diff = n2 - n1;
 
    // Initially take carry zero
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n1 - 1; i >= 0; i--)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        int sum = ((int)(str1[i] - '0') +
                (int)(str2[i + diff]-'0') + carry);
        str += (char)(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining digits of str2[]
    for (int i = n2 - n1 - 1; i >= 0; i--)
    {
        int sum = ((int)(str2[i] - '0') + carry);
        str += (char)(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry > 0)
        str += (char)(carry + '0');
 
    // reverse resultant string
    char[] ch2 = str.ToCharArray();
    Array.Reverse(ch2);
    return new string(ch2);
}
 
// Driver code
static void Main()
{
    string str1 = "12";
    string str2 = "198111";
    Console.WriteLine(findSum(str1, str2));
}
}
 
// This code is contributed by mits

PHP

<?php
// PHP program to find sum of two large numbers.
 
// Function for finding sum of larger numbers
function findSum($str1, $str2)
{
    // Before proceeding further, make
    // sure length of str2 is larger.
    if(strlen($str1)> strlen($str2))
    {
        $temp = $str1;
        $str1 = $str2;
        $str2 = $temp;
    }
 
    // Take an empty string for storing result
    $str3 = "";
 
    // Calculate length of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
    $diff = $n2 - $n1;
 
    // Initially take carry zero
    $carry = 0;
 
    // Traverse from end of both strings
    for ($i = $n1 - 1; $i >= 0; $i--)
    {
        // Do school mathematics, compute sum 
        // of current digits and carry
        $sum = ((ord($str1[$i]) - ord('0')) +
               ((ord($str2[$i + $diff]) -
                 ord('0'))) + $carry);
     
        $str3 .= chr($sum % 10 + ord('0'));
         
         
        $carry = (int)($sum / 10);
    }
 
    // Add remaining digits of str2[]
    for ($i = $n2 - $n1 - 1; $i >= 0; $i--)
    {
        $sum = ((ord($str2[$i]) - ord('0')) + $carry);
        $str3 .= chr($sum % 10 + ord('0'));
        $carry = (int)($sum / 10);
    }
 
    // Add remaining carry
    if ($carry)
        $str3 .= chr($carry + ord('0'));
 
    // reverse resultant string
    return strrev($str3);
}
 
// Driver code
$str1 = "12";
$str2 = "198111";
print(findSum($str1, $str2));
 
// This code is contributed by mits
?>

Javascript

<script>
 
// JavaScript program to find sum of two large numbers.
 
// Function for finding sum of larger numbers
function findSum(str1,str2)
{
    // Before proceeding further, make sure length
    // of str2 is larger.
    if (str1.length > str2.length){
       
        let temp = str1
        str1 = str2
        str2 = temp
 
    }
         
    // Take an empty string for storing result
    let str = "";
 
    // Calculate length of both string
    let n1 = str1.length, n2 = str2.length;
    let diff = n2 - n1;
    // Initially take carry zero
    let carry = 0;
 
    // Traverse from end of both strings
    for (let i=n1-1; i>=0; i--)
    {
        // Do school mathematics, compute sum of
        // current digits and carry
        // console.log((str1.charCodeAt(i)-48),(str2.charCodeAt(i+diff)-48))
        let sum = ((str1.charCodeAt(i)-48) +
                (str2.charCodeAt(i+diff)-48) +
                carry);
        str+=(sum%10);
        carry = Math.floor(sum/10);
    }
 
    // // Add remaining digits of str2[]
    for (let i=n2-n1-1; i>=0; i--)
    {
        let sum = ((str2.charCodeAt(i)-48)+carry);
        str+=(sum%10);
        carry = Math.floor(sum/10);
    }
 
    // Add remaining carry
    if (carry)
        str+=(carry+'0');
 
    // reverse resultant string
 
    str = str.split("").reverse().join("");
 
    return str;
}
 
// Driver code
let str1 = "12";
let str2 = "198111";
document.write(findSum(str1, str2),"</br>");
 
// This code is contributed by shinjanpatra.
</script>

Producción:

198123

Complejidad de tiempo: O(max(n1, n2)) donde n1 y n2 son longitudes de dos strings de entrada que representan números.

Espacio auxiliar: O(max(n1, n2))

Este artículo es una contribución de DANISH_RAZA . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *