在进行加法是若符号不同则进行减法,减法带绝对值,不然最高位会出现负数,不便于输出
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct bign {
int d[1000];
int len, flag; //flag 标识正数和负数 1 为负数 0 正数
bign() {
fill(d, d + 1000, 0);
len = 0;
flag = 0; //默认为正数
}
};
bign change(char str[]) {
bign a;
if (str[0] == '-') a.flag = 1;
a.len = strlen(str);
for (int i = 0; i < a.len; i++) {
if (str[a.len - i - 1] >= '0' && str[a.len - i - 1] <= '9') {
a.d[i] = str[a.len - i - 1] - '0';
}
}
if (str[0] == '+' || str[0] == '-') a.len--;
return a;
}
//去除前导0,但保证有一位为0
void dislodge(bign &a) {
while (a.len - 1 > 0 && a.d[a.len - 1] == 0) a.len--;
}
//a > b返回1 相等返回0 小于返回-1
int compare(bign a, bign b) {
if (a.len > b.len) return 1;
else if (a.len < b.len) return -1;
else {
for (int i = a.len - 1; i >= 0; i--) {
if (a.d[i] > b.d[i]) return 1;
else if( a.d[i] < b.d[i]) return -1;
}
}
return 0;
}
bign add(bign a, bign b) {
bign c;
int carray = 0;
for (int i = 0; i < a.len || i < b.len; i++) {
int temp = a.d[i] + b.d[i] + carray;
c.d[c.len++] = temp % 10;
carray = temp / 10;
}
if (carray != 0) c.d[c.len++] = carray;
dislodge(c);
return c;
}
//减法 (a - b)
bign sub(bign a, bign b) {
bign c;
for (int i = 0; i < a.len || i < b.len; i++) {
if (a.d[i] < b.d[i] && (i + 1) < a.len) {
a.d[i+1]--;
a.d[i] += 10;
}
c.d[c.len++] = abs(a.d[i] - b.d[i]);
}
dislodge(c);
return c;
}
int main() {
char stra[1001], strb[1001];
scanf("%s %s", stra, strb);
bign a = change(stra);
bign b = change(strb);
bign c;
if (a.flag == b.flag) c = add(a, b);
else c = sub(a, b);
// 判断符号
if (compare(a, b) == -1) c.flag = 1;
if (c.flag == 1) printf("-");
for (int i = c.len - 1; i >= 0; i--) {
printf("%d", c.d[i]);
}
return 0;
}