Sum of two large numbers

Given two numbers as strings. The numbers may be very large (may not fit in long long int), the task is to find sum of these two numbers.

Examples:

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

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

The idea is based on school mathematics. We traverse both strings from end, one by one add digits and keep track of carry. To simplify the process, we do following:
1) Reverse both strings.
2) Keep adding digits one by one from 0’th index (in reversed strings) to end of smaller string, append the sum % 10 to end of result and keep track of carry as sum/10.
3) Finally reverse the result.



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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
?>

chevron_right



Output:

198123

Optimization:
We can avoid the first two string reverse operations by traversing them from end. Below is optimized solution.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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 
?>

chevron_right



Output:

198123

Time Complexity : O(n1 + n2) where n1 and n2 are lengths of two input strings representing numbers.

This article is contributed by DANISH_RAZA . If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up