大整数相加(难度3)
题目描述:
超出整数存储范围的两大正整数相加
注意:不能使用 BigInteger 类或者其他类型的库函数
输入:两数用”#“分隔
分析:
可以采用最原始的方法:逐为相加的方法。
把两个大整数作为两个字符串,字符串从后往前将对应位进行相加,相加的和逆序存入新的字符串,再将新字符串输出即可。
答案:
#include<iostream>
#include<string>
using namespace std;
int main()
{
// 准备工作,分隔字符串
string num, sum;
cin >> num;
int pos = num.find("#"); // 找到分隔符的下标
string num1 = num.substr(pos + 1), num2 = num.substr(0, pos); // 将两个大整数字符串分开
// 加法
// 步骤一:将两数位数相等
int len1 = num1.length(), len2 = num2.length();
if (len1 < len2)
{// 为了逐为相加,将位数小的用零在前补齐
for (int i = 1; i <= len2 - len1; i++)
{
num1 = "0" + num1;
}
}
else
{
for (int i = 1; i <= len1 - len2; i++)
{
num2 = "0" + num2;
}
}
// 步骤二:逐为相加
int len = num2.length(); // 重新定义长度,此时两数已经位数相等了
int temp, a = 0; // temp 临时存放每位相加值,a 后位的进位值,第一次为 0,表示个位没有后位的进位值
for (int i = len - 1; i >= 0; i--)
{ // 从低位(个位)到高位逐为相加
temp = num1[i] - '0' + num2[i] - '0' + a; // 字符减去‘0’就可以得到相应的整数
a = temp / 10; // 如果 temp 大于 10,需进位
temp = temp % 10;
sum = char(temp + '0') + sum; // 保存到新字符串中
}
// 步骤三:检查是否增加一位
if (a == 1)
{
sum = "1" + sum;
}
cout << sum << endl;
return 0;
}
验证:
12345678911235#8234589119212
20580268030447