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

## Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.

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++ 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 lenght 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;
}

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

Output:

`198123`

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

```// 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 lenght of both string
int n1 = str1.length(), n2 = str2.length();
int diff = n2 - n1;

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

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

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.

# GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
2.3 Average Difficulty : 2.3/5.0
Based on 9 vote(s)