Related Articles
Sum of two large numbers
• Difficulty Level : Medium
• Last Updated : 22 Apr, 2021

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

 `// C++ program to find sum of two large numbers.``#include``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

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

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

 ``

Output:

`198123`

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

C++

 `// C++ program to find sum of two large numbers.``#include``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

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

Output:

`198123`

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

Auxiliary Space: O(max(n1, n2))

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.