用c++写对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输出。 提示 对于加法,考虑先把两个数对齐,再按位加(要考虑进位),运算结果以字符串形式输出。 对于减法,先比较被减数和减数的大小,如果被减数小于减数,则需要交换被减数和减数,然后再按位减(要考虑借位)。
时间: 2024-03-14 21:44:13 浏览: 150
好的,下面是我为您编写的 C++ 代码,实现超长整数的加减运算:
```cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(const string& a, const string& b) {
// 将两个字符串补齐到相同长度
string sa = a, sb = b;
int len_a = sa.length(), len_b = sb.length();
if (len_a > len_b) {
sb = string(len_a - len_b, '0') + sb;
} else {
sa = string(len_b - len_a, '0') + sa;
}
int carry = 0; // 进位
string res; // 存放结果
for (int i = max(len_a, len_b) - 1; i >= 0; i--) {
int tmp = sa[i] - '0' + sb[i] - '0' + carry;
res = char(tmp % 10 + '0') + res;
carry = tmp / 10;
}
if (carry) {
res = '1' + res;
}
return res;
}
string sub(const string& a, const string& b) {
// 判断 a 是否小于 b
bool is_negative = false;
string sa = a, sb = b;
if (a.length() < b.length() || (a.length() == b.length() && a < b)) {
swap(sa, sb);
is_negative = true;
}
// 将两个字符串补齐到相同长度
int len_a = sa.length(), len_b = sb.length();
sb = string(len_a - len_b, '0') + sb;
int borrow = 0; // 借位
string res; // 存放结果
for (int i = len_a - 1; i >= 0; i--) {
int tmp = sa[i] - sb[i] - borrow;
if (tmp < 0) {
tmp += 10;
borrow = 1;
} else {
borrow = 0;
}
res = char(tmp + '0') + res;
}
// 去掉前导0
while (res.length() > 1 && res[0] == '0') {
res.erase(res.begin());
}
if (is_negative) {
res = '-' + res;
}
return res;
}
int main() {
string a, op, b;
cin >> a >> op >> b;
if (op == "+") {
cout << add(a, b) << endl;
} else if (op == "-") {
cout << sub(a, b) << endl;
}
return 0;
}
```
这段代码实现了超长整数的加减运算。其中 `add` 函数实现了加法,`sub` 函数实现了减法。主函数中首先读入两个超长整数和运算符,然后根据运算符调用相应的函数计算结果,并输出。
注意,这段代码中使用了 C++ 的字符串操作,可以方便地处理超长整数。具体来说,为了实现对齐和补齐,我们可以使用字符串的构造函数和重载运算符;而在按位加减的过程中,则可以直接将字符转换成数字处理。
阅读全文