#include <iostream> #include <cstring> using namespace std; #define MAX_LENGTH 100 // 字符串逆序 void reverse(string& s) { int left = 0, right = s.length() - 1; while (left < right) { swap(s[left], s[right]); left++, right--; } } // 字符串加法 string add(string num1, string num2) { // 字符串逆序 reverse(num1), reverse(num2); // 用 0 补齐,使它们的长度相等 if (num1.length() < num2.length()) { num1 += string(num2.length() - num1.length(), '0'); } else { num2 += string(num1.length() - num2.length(), '0'); } // 从低位开始,将两个字符串对应位相加,考虑进位,将结果存到一个新的字符串中 string result; int carry = 0; for (int i = 0; i < num1.length(); i++) { int s = num1[i] - '0' + num2[i] - '0' + carry; carry = s / 10; result += to_string(s % 10); } // 如果最高位有进位,则将进位也加上 if (carry > 0) { result += to_string(carry); } // 字符串逆序,删除前导 0,输出结果 reverse(result); result.erase(0, result.find_first_not_of('0')); if (result.empty()) { result = "0"; } return result; } // 字符串减法 string subtract(string num1, string num2) { // 比较被减数和减数的大小 if (num1.length() < num2.length() || (num1.length() == num2.length() && num1 < num2)) { swap(num1, num2); num1 = '-' + num1; } // 字符串逆序 reverse(num1), reverse(num2); // 用 0 补齐,使它们的长度相等 num2 += string(num1.length() - num2.length(), '0'); // 从低位开始,将两个字符串对应位相减,考虑借位,将结果存到一个新的字符串中 string result; int borrow = 0; for (int i = 0; i < num1.length(); i++) { int s = num1[i] - '0' - num2[i] + borrow; if (s < 0) { s += 10; borrow = -1; } else { borrow = 0; } result += to_string(s); } // 字符串逆序,删除前导 0,输出结果 reverse(result); result.erase(0, result.find_first_not_of('0')); if (result.empty()) { result = "0"; } return result; } int main() { string num1, num2, op; cin >> num1 >> op >> num2; if (op == "+") { cout << add(num1, num2) << endl; } else { cout << subtract(num1, num2) << endl; } return 0; }
时间: 2024-02-14 21:12:31 浏览: 99
这段代码存在两个问题:
1. 代码中的第一行和第二行之间有一个空格,这会导致编译器无法正确解析头文件。应该将这两行代码合并为一行,去掉中间的空格,即:
#include <iostream>
#include <cstring>
2. 字符串减法中存在一个逻辑错误。在对两个字符串进行减法时,如果被减数小于减数,应该将它们交换位置,并在被减数前加上负号。但是,在这段代码中,交换位置的语句和添加负号的语句是写在两个不同的 if 分支中的,这会导致在被减数和减数相等且都为 0 的情况下出现错误。应该将这两个语句合并为一句:
if (num1.length() < num2.length() || (num1.length() == num2.length() && num1 < num2)) {
swap(num1, num2);
num1 = '-' + num1;
}
修改后的代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
#define MAX_LENGTH 100
void reverse(string& s) {
int left = 0, right = s.length() - 1;
while (left < right) {
swap(s[left], s[right]);
left++, right--;
}
}
string add(string num1, string num2) {
reverse(num1), reverse(num2);
if (num1.length() < num2.length()) {
num1 += string(num2.length() - num1.length(), '0');
} else {
num2 += string(num1.length() - num2.length(), '0');
}
string result;
int carry = 0;
for (int i = 0; i < num1.length(); i++) {
int s = num1[i] - '0' + num2[i] - '0' + carry;
carry = s / 10;
result += to_string(s % 10);
}
if (carry > 0) {
result += to_string(carry);
}
reverse(result);
result.erase(0, result.find_first_not_of('0'));
if (result.empty()) {
result = "0";
}
return result;
}
string subtract(string num1, string num2) {
if (num1.length() < num2.length() || (num1.length() == num2.length() && num1 < num2)) {
swap(num1, num2);
num1 = '-' + num1;
}
reverse(num1), reverse(num2);
num2 += string(num1.length() - num2.length(), '0');
string result;
int borrow = 0;
for (int i = 0; i < num1.length(); i++) {
int s = num1[i] - '0' - num2[i] + borrow;
if (s < 0) {
s += 10;
borrow = -1;
} else {
borrow = 0;
}
result += to_string(s);
}
reverse(result);
result.erase(0, result.find_first_not_of('0'));
if (result.empty()) {
result = "0";
}
return result;
}
int main() {
string num1, num2, op;
cin >> num1 >> op >> num2;
if (op == "+") {
cout << add(num1, num2) << endl;
} else {
cout << subtract(num1, num2) << endl;
}
return 0;
}
```
阅读全文