用C++编写程序:任务描述 对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输出。 提示 对于加法,考虑先把两个数对齐,再按位加(要考虑进位),运算结果以字符串形式输出。 对于减法,先比较被减数和减数的大小,如果被减数小于减数,则需要交换被减数和减数,然后再按位减(要考虑借位)。
时间: 2024-03-10 19:50:37 浏览: 58
好的,这是一个很好的编程练习题,我可以帮您解答。
首先,我们可以用字符串来存储超长整数,这样就可以避免使用 int 或 long 等基本类型无法表示的问题。接下来,我们需要考虑如何实现加法和减法运算。
对于加法,我们可以先将两个字符串对齐,即在较短的字符串前面补0,使得两个字符串的长度相等。然后,从字符串的末尾开始,依次对每一位进行相加,并考虑进位的情况。最后,将得到的结果字符串反转一下输出即可。
对于减法,我们需要先比较被减数和减数的大小,如果被减数小于减数,则需要交换被减数和减数。然后,我们可以先将两个字符串对齐,即在较短的字符串前面补0,使得两个字符串的长度相等。接下来,从字符串的末尾开始,依次对每一位进行相减,并考虑借位的情况。最后,将得到的结果字符串反转一下输出即可。如果结果为负数,则需要在前面加上负号。
下面是一个 C++ 实现的示例代码,可以供您参考:
```cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string add(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string res = "";
int carry = 0;
for (int i = 0; i < max(a.size(), b.size()); i++) {
int x = i < a.size() ? a[i] - '0' : 0;
int y = i < b.size() ? b[i] - '0' : 0;
int sum = x + y + carry;
res += (sum % 10) + '0';
carry = sum / 10;
}
if (carry) res += carry + '0';
reverse(res.begin(), res.end());
return res;
}
string sub(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string res = "";
int borrow = 0;
for (int i = 0; i < a.size(); i++) {
int x = a[i] - '0';
int y = i < b.size() ? b[i] - '0' : 0;
int diff = x - y - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
res += diff + '0';
}
while (res.size() > 1 && res.back() == '0') res.pop_back();
if (borrow) res += '-';
reverse(res.begin(), res.end());
return res;
}
int main() {
string a, b, op;
cin >> a >> op >> b;
if (op == "+") {
cout << add(a, b) << endl;
} else {
if (a.size() < b.size() || (a.size() == b.size() && a < b)) {
swap(a, b);
cout << '-';
}
cout << sub(a, b) << endl;
}
return 0;
}
```
阅读全文