任务描述 对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输出。
时间: 2024-03-17 22:39:44 浏览: 136
超大整数的乘法,用字符串实现
下面是使用字符串实现超长整数加法和减法的示例代码,其中涉及到了字符串的逆序、比较大小、去除前导0等操作。
```cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(string num1, string num2) {
int len1 = num1.length();
int len2 = num2.length();
// 让num1成为较长的数字
if (len1 < len2) {
swap(num1, num2);
swap(len1, len2);
}
int carry = 0;
string res = "";
// 从字符串的末尾开始逐位相加
for (int i = 0; i < len1; ++i) {
int sum = num1[len1 - 1 - i] - '0';
if (i < len2) {
sum += num2[len2 - 1 - i] - '0';
}
sum += carry;
carry = sum / 10;
sum %= 10;
res += to_string(sum);
}
if (carry) {
res += to_string(carry);
}
// 反转结果字符串输出
reverse(res.begin(), res.end());
return res;
}
string subtract(string num1, string num2) {
int len1 = num1.length();
int len2 = num2.length();
bool negative = false;
// 确保num1大于等于num2
if (num1 < num2) {
swap(num1, num2);
swap(len1, len2);
negative = true;
}
int borrow = 0;
string res = "";
// 从字符串的末尾开始逐位相减
for (int i = 0; i < len1; ++i) {
int diff = num1[len1 - 1 - i] - '0';
if (i < len2) {
diff -= (num2[len2 - 1 - i] - '0');
}
diff -= borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
res += to_string(diff);
}
// 去除前导0
while (res.length() > 1 && res.back() == '0') {
res.pop_back();
}
// 反转结果字符串输出
reverse(res.begin(), res.end());
if (negative) {
res = "-" + res;
}
return res;
}
int main() {
string num1, num2, op;
cin >> num1 >> op >> num2;
if (op == "+") {
string sum = add(num1, num2);
cout << sum << endl;
} else if (op == "-") {
string diff = subtract(num1, num2);
cout << diff << endl;
}
return 0;
}
```
该程序可以处理输入的两个任意长度的非负超长整数相加或相减,并输出结果。需要注意的是,对于减法运算,如果结果为0,也需要去除前导0。
阅读全文