对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输出。 以上是问题描述,请用c++语言完成编程
时间: 2024-03-18 10:38:42 浏览: 102
C++中超长数类型的构造与实现
好的,我已经明白了你的问题。以下是代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
// 函数声明
string add(string num1, string num2);
string sub(string num1, string num2);
int main() {
string num1, num2, res;
char op;
cin >> num1 >> op >> num2;
if (op == '+') {
res = add(num1, num2);
} else if (op == '-') {
res = sub(num1, num2);
}
cout << res << endl;
return 0;
}
// 字符串加法
string add(string num1, string num2) {
int len1 = num1.length(), len2 = num2.length();
string res = "";
int carry = 0; // 进位
while (len1 || len2 || carry) {
int n1 = len1 ? num1[--len1] - '0' : 0;
int n2 = len2 ? num2[--len2] - '0' : 0;
int sum = n1 + n2 + carry;
carry = sum / 10;
res += to_string(sum % 10);
}
reverse(res.begin(), res.end());
return res;
}
// 字符串减法
string sub(string num1, string num2) {
int len1 = num1.length(), len2 = num2.length();
string res = "";
int borrow = 0; // 借位
while (len1 || len2) {
int n1 = len1 ? num1[--len1] - '0' : 0;
int n2 = len2 ? num2[--len2] - '0' : 0;
int diff = n1 - n2 - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
res += to_string(diff);
}
reverse(res.begin(), res.end());
// 去掉前导0
int pos = 0;
while (res[pos] == '0') {
pos++;
}
res = res.substr(pos);
if (res == "") {
res = "0";
}
// 如果结果为负数,加上负号
if (borrow == 1) {
res = '-' + res;
}
return res;
}
```
代码思路:
- 首先读入两个字符串和运算符。
- 然后根据运算符选择加法或减法。
- 加法和减法的实现思路类似,都是从低位到高位逐位进行计算,需要考虑进位和借位的情况。
- 最后,需要对减法的结果进行特殊处理:去掉前导0,并且如果结果为负数,加上负号。
注意:
- 字符串加法和减法的实现中,需要将字符串反转,从低位到高位进行计算。
- 在进行字符串减法时,需要注意被减数和减数的大小关系,如果被减数小于减数,需要借位。
测试样例:
输入:
```
123456789012345678901 + 123
```
输出:
```
123456789012345679024
```
输入:
```
123456789012345678901 - 123
```
输出:
```
123456789012345678778
```
输入:
```
123456789012345678901 - 123456789012345678901
```
输出:
```
0
```
阅读全文