PAT中常考的大整数运算一般是加减法,乘除法少有考察。《算法笔记》上用的结构体实现,这里选用STL中的string容器实现,代码如下:
注:题目中可能会给出两个大整数的长度或者大小关系等条件,那么又可以根据情况精简代码!比如:1024. Palindromic Number (25)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string a, string b) {
reverse(a.begin(), a.end()); //将高位置于数组高位便于计算
reverse(b.begin(), b.end());
if (a.size() > b.size()) b.resize(a.size(), '0'); //高位补0
else a.resize(b.size(), '0');
int len = a.size();
string r = string(len,'0'); //result
int carry = 0;
for (int i = 0; i < len; i++) {
int tem = a[i] - '0' + b[i] - '0' + carry;
r[i] = tem % 10 + '0';
carry = tem / 10;
}
if (carry != 0) r += "1"; //还有进位则补在高位(字符串连接)
reverse(r.begin(), r.end()); //倒转
return r;
}
string sub(string a, string b) {
bool flag = true;
//判断大小并补0
if (a.size() > b.size()) {
b.resize(a.size(), '0');
}
else if (a.size() < b.size()) {
a.resize(b.size(), '0');
swap(a, b); //交换
flag = false;
}
else if (a < b) {
swap(a, b);
flag = false;
}
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int len = a.size();
string r = string(len, '0'); //result
for (int i = 0; i < len; i++) {
if (a[i] < b[i]) {
a[i] += 10; //不足借位
a[i + 1]--;
}
r[i] = a[i] - b[i] + '0'; //注意+'0'
}
reverse(r.begin(), r.end());
//删除高位多余的0,但注意保证如果结果为0,留一个0
while (r[0] == '0' && r.size() > 1) {
r.erase(r.begin());
}
if (!flag) r = "-" + r; //如果a<b输出负号
return r;
}
int main() {
string a, b;
cin >> a >> b;
cout << add(a, b) << endl << sub(a, b);
return 0;
}