题目

测试样例
输入样例1(自带,无参考价值)
1 2
输出样例1
3
输入样例2(自编,b为正)
1234567898765432123456789 1
输出样例2
1234567898765432123456790
输出样例3(自编,b为负)
99999999999999 -999999
输出样例3
99999999000000
提交结果截图

带详细注释的源代码
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
using namespace std;
//大整数加法
string sum(string a, string b)
{
string res;
int a_len = a.length(), b_len = b.length();
if (a_len >= b_len)
res = a;
else
res = b;
int carry_bit = 0;//进位
int k = max(a_len, b_len) - 1;//取2者中更大一方的位数
for (int i = a_len - 1, j = b_len - 1; i >= 0 && j >= 0; i--, j--, k--)
{
res[k] = a[i] + b[j] - '0' + carry_bit;//要加上上一次的进位
carry_bit = 0;
while (res[k] > '9')//用while是怕有多次进位
{
res[k] -= 10;
carry_bit++;
}
}
while (carry_bit)//若还有进位,接下来处理res字符串 相当于res + carry_bit
{
if (k == -1 && carry_bit)
{
res = '0' + res;//最后在前面加上一位
res[0] += carry_bit;
break;
}
res[k] = res[k] + carry_bit;
carry_bit = 0;
while (res[k] > '9')
{
res[k] -= 10;
carry_bit++;
}
k--;
}
return res;
}
//大整数减法
string sub(string a, string b)
{
string res;
bool can_flag = true;//a-b是否够减
int a_len = a.length(), b_len = b.length();
if (!((a_len > b_len || (a_len == b_len && a > b))))
{
can_flag = false;//标识a-b不够减
swap(a, b);//若是a<b则交换a,b
a_len = a.length(), b_len = b.length();//更新长度
}
res = a;
int borrow_bit = 0;//借位
int k = a_len - 1;
for (int i = a_len - 1, j = b_len - 1; i >= 0 && j >= 0; i--, j--, k--)
{ //类似加法操作,不过这里是借位
res[k] = a[i] - b[j] - borrow_bit + '0';
borrow_bit = 0;
while (res[k] < '0')
{
res[k] += 10;
borrow_bit++;
}
}
while (borrow_bit)//如果还有借位
{
res[k] = res[k] - borrow_bit;
borrow_bit = 0;
while (res[k] < '0')
{
res[k] -= 10;
borrow_bit++;
}
k--;
}
if (!can_flag)//不够减则结果为负数
res = '-' + res;
while (res[0] == '0')//去掉开头多余的0
res = res.substr(1, res.length());
return res;
}
int main()
{
string a, b, res;
cin >> a >> b;
if (b[0] != '-')
res = sum(a, b);
else
{
b = b.substr(1, b.length());//去除负号
res = sub(a, b);
}
cout << res << endl;
return 0;
}