高精度加法
思路:首先将字符串按照由低位到高位的顺序存入数组,然后按位相加,逢十进一
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int a[N], b[N];
int main() {
string sa, sb; cin >> sa >> sb;
int lena = sa.size(), lenb = sb.size();
for (int i = 0; i < lena; i++) a[lena - 1 - i] = sa[i] - '0';
for (int i = 0; i < lenb; i++) b[lenb - 1 - i] = sb[i] - '0';
int len = max(lena, lenb);
for (int i = 0; i < len; i++) {
a[i] += b[i];
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
if (a[len]) len++;
for (int i = len - 1; i >= 0; i--) cout << a[i];
cout << endl;
return 0;
}
高精度减法
思路:处理字符串的方式与加法相同,不过此题有两种情况需要分析,第一种情况:a > b,这种情况下直接相减即可;第二种情况:a < b,那么此时有两种可能:①a的位数比b的位数少 ②a,b的位数相同a<b;在第二种情况下,我们交换a和b以方便计算,同时留下一个标志neg表示最终结果为负的
注意:在计算完后注意要将高位的0舍去
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10100;
int a[N], b[N];
string sub(string sa, string sb) {
if (sa == sb) return "0";
int neg = 0;
if (sa.size() < sb.size() || sa.size() == sb.size()) swap(sa, sb), neg = 1;
int lena = sa.size(), lenb = sb.size();
for (int i = 0; i < lena; i++) a[lena - 1 - i] = sa[i] - '0';
for (int i = 0; i < lenb; i++) b[lenb - 1 - i] = sb[i] - '0';
for (int i = 0; i < lena; i++) {
a[i] -= b[i];
if (a[i] < 0) {
a[i] += 10;
a[i + 1] -= 1;
}
}
while (!a[--lena] && lena > 0);
lena++;
string res;
for (int i = lena - 1; i >= 0; i--) res += a[i] + '0';
if (neg) res = "-" + res;
return res;
}
int main() {
string sa, sb; cin >> sa >> sb;
cout << sub(sa, sb) << endl;
return 0;
}