实际应用中,有时会遇到非常大的整数,可能会超过long、甚至long long的范围。这时就需要用不限长度的字符串保存数据,然后进行计算。
最简单的需求就是“大整数相加”,即给定两个字符串形式的非负大整数 num1 和num2 ,计算它们的和。
我们可以把字符串按每个字符一一拆开,相当于遍历整数上的每一个数位,然后通过“乘10叠加”的方式,就可以整合起来了。这相当于算术中的“竖式加法”。
#include<iostream>
using namespace std;
int main()
{
string num1 = "32535943020935527435432875";
string num2 = "9323298429842985843509";
// 用一个空字符串保存结果
string result;
// 获取两数个位的索引
int p1 = num1.size() - 1;
int p2 = num2.size() - 1;
// 设置一个进位标志
int carry = 0;
while (p1 >= 0 || p2 >= 0 || carry > 0)
{
int x = (p1 >= 0) ? (num1[p1] - '0') : 0;
int y = (p2 >= 0) ? (num2[p2] - '0') : 0;
int sum = x + y + carry;
result += (sum % 10 + '0'); // 和的个位写入结果
carry = sum / 10; // 和的十位保存在进位上
// 继续遍历下一位
--p1;
--p2;
}
//因为拼接时是从个位开始拼接的,所以得到的是颠倒的结果,需要对结果进行翻转
// 结果需要做翻转
int i = 0, j = result.size() - 1;
while (i < j)
{
char temp = result[j];
result[j] = result[i];
result[i] = temp;
++i;
--j;
}
cout << num1 << " + " << num2 << endl << endl;
cout << " = " << result;
}
结果如下: