A+B & A-B
2023-08-15 14:49:04
发布于:广东
2阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
string sub(string a, string b);
// 删除前置0
void remove0(string &s) {
// "0"
while (s[0] == '0' && s.size() > 1) s.erase(s.begin());
}
string add(string a, string b) {
// a 或 b 大整数可能存在 负数 比如 -222 + (-4) = -226
// -2 + 7 = 5 => 7 - 2
// 9 + (-2) =7 => 9 - 2
// -2 -9 = -11 => -9 - 2
// 1 + (-1) 1 - 1
if (a.front() == '-') return sub(b, a.substr(1)); // 调用减法去计算,b字符串 - a字符串(已经没有负号了) a[0] == '-'
if (b.front() == '-') return sub(a, b.substr(1)); // 调用减法 a - b
if (a.size() < b.size()) a.swap(b); // 永久将长的整数放在 a 字符串中
a.insert(a.begin(), '0'); // 默认在 a 字符串插入一个字符 '0'
int carry = 0, i = a.size() - 1, j = b.size() - 1; // carry 表示进位,i 是 a 字符串的长度,j 是 b 字符串的长度
for (; i >= 0; i--, j--) {
// 字符串 a[i] 需要减去字符 '0' 才能得到对应的整数
int sum = a[i] - '0' + (j >= 0 ? b[j] - '0' : 0) + carry; // 对应位置相加,若b字符串已经没有数字 就+0,+carry 是否有进位
a[i] = sum % 10 + '0'; // 相加后是否产生进位后的数字
carry = sum / 10; // 判断是否进位了
}
remove0(a); // 将前置 0 删除
return a;
}
bool ALessB(string a, string b) {
// 现根据长度,判断哪个数字小,返回a的长度是否小于b的长度
// 412678 127
if (a.size() != b.size()) return a.size() < b.size();
return a < b;
}
string sub(string a, string b) {
// a 字符串带有 - 号
if (a.front() == '-') {
// 转换为 加法 -9 - 2 => 9 + 2 = 11 结果基础上加 - => -11
a = add(a.substr(1), b);
if (a != "0" && b.front() != '-') a.insert(a.begin(), '-'); // 如果结果不为0,需要加上负号
else if (a != "0" && b.front() == '-') a.erase(a.begin());
return a;
} else if (b.front() == '-') {
return add(a, b.substr(1)); // 8 - -1 = > 8 + 1 = 9 运用加法
}
// 1. 数字大小 时刻大的数字放在 a 字符串中
// "12" - "24" "12" < "24"
int sign = 1; // 1 正数, -1 负数
if (ALessB(a, b)) { // a 字符串的数字小于 b 字符串中的数字
sign = -1; // 结果负数
a.swap(b);
a.insert(a.begin(), '0');
}
// 2.模拟减法
int borrow = 0, i = a.size() - 1, j = b.size() - 1; // i 标记 a 字符串最后一位,j 标记 b 字符串最后一位
for (; i >= 0; i--, j--) { // 将长度最长的数字每位计算
int A = a[i] - '0', B = 0; // A 被减数,从 a 字符串中获取
if (j >= 0) B = b[j] - '0'; // B 减数,从 b 字符串中获取
int diff = A - B - borrow; borrow = 0; // 暂时没有借位
if (diff < 0) {
borrow = 1; // 需要借位
diff += 10; // 当前借位后的差值
}
a[i] = diff + '0'; // 加上字符'0' ,才能使数字 0~9 变成 字符 '0'~'9'
}
// 3. 删除前置0
remove0(a);
if (sign == -1) a.insert(a.begin(), '-'); // 结果为负 添加负号
return a;
}
int main() {
string a, b;
cin >> a >> b;
cout << add(a, b);
return 0;
}
这里空空如也
有帮助,赞一个