c++编写对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变
时间: 2023-07-20 11:36:17 浏览: 539
好的,这里提供一个基于字符串的超长整数加减法的 c++ 实现代码,您可以参考一下:
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 去掉字符串前导0
string removeLeadingZeros(string s) {
while (s.size() > 1 && s[0] == '0') {
s.erase(s.begin());
}
return s;
}
// 实现超长整数的加法
string add(string s1, string s2) {
// 将两个字符串补齐,使其长度相等
int n1 = s1.size(), n2 = s2.size();
if (n1 > n2) {
s2 = string(n1 - n2, '0') + s2;
} else {
s1 = string(n2 - n1, '0') + s1;
}
// 从低位到高位逐位相加,并处理进位
string res = "";
int carry = 0;
for (int i = s1.size() - 1; i >= 0; i--) {
int tmp = s1[i] - '0' + s2[i] - '0' + carry;
res += to_string(tmp % 10);
carry = tmp / 10;
}
if (carry) {
res += to_string(carry);
}
// 将结果翻转并去掉前导0
reverse(res.begin(), res.end());
return removeLeadingZeros(res);
}
// 实现超长整数的减法
string subtract(string s1, string s2) {
// 将两个字符串补齐,使其长度相等
int n1 = s1.size(), n2 = s2.size();
if (n1 > n2) {
s2 = string(n1 - n2, '0') + s2;
} else {
s1 = string(n2 - n1, '0') + s1;
}
// 判断s1是否小于s2,如果是则交换两个字符串
if (s1 < s2) {
swap(s1, s2);
cout << "-";
}
// 从低位到高位逐位相减,并处理借位
string res = "";
int borrow = 0;
for (int i = s1.size() - 1; i >= 0; i--) {
int tmp = s1[i] - s2[i] - borrow;
if (tmp < 0) {
tmp += 10;
borrow = 1;
} else {
borrow = 0;
}
res += to_string(tmp);
}
// 将结果翻转并去掉前导0
reverse(res.begin(), res.end());
return removeLeadingZeros(res);
}
// 根据运算符选择进行加法或减法运算
string longIntCalc(string s1, string s2, char op) {
if (op == '+') {
return add(s1, s2);
} else if (op == '-') {
return subtract(s1, s2);
} else {
return "Invalid operator";
}
}
int main() {
// 测试样例
string s1 = "123456789012345678901";
string s2 = "123";
char op = '+';
cout << longIntCalc(s1, s2, op) << endl; // 123456789012345679024
s1 = "123456789012345678901";
s2 = "123";
op = '-';
cout << longIntCalc(s1, s2, op) << endl; // 123456789012345678778
return 0;
}
```
代码中定义了三个函数:`removeLeadingZeros`用于去掉字符串前导0,`add`用于实现超长整数的加法,`subtract`用于实现超长整数的减法。最后定义了一个`longIntCalc`函数,根据输入的运算符选择进行加法或减法运算。
需要注意的是,在减法运算中,需要判断被减数是否小于减数,如果是则交换两个字符串,并在最终结果前加上负号。此外,如果运算结果为0,则需要输出字符串'0'而不是空字符串。
阅读全文