任务描述 对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输出。 提示 对于加法,考虑先把两个数对齐,再按位加(要考虑进位),运算结果以字符串形式输出。 对于减法,先比较被减数和减数的大小,如果被减数小于减数,则需要交换被减数和减数,然后再按位减(要考虑借位)。#include <iostream> #include <cstring> using namespace std; #define MAX_LENGTH 100 //相关函数的原型 /********* Begin *********/ /********* End *********/ int main() { /********* Begin *********/ string a,b,c; cin>>a>>b>>c; int d; int len1=strlen(a); int len2=strlen(c); if(b=="+"){ for(int i=len1;i<=len1;i--){ for(int j=len2;j<=len2;j--){ d=a[i]+c[j]; if(d>10){ d=d-1; } } } } /********* End *********/ return 0; } //相关函数的具体定义 /********* Begin *********/
时间: 2023-07-06 10:36:37 浏览: 109
C代码实现超长整数字符串 相加,及相应执行程序
下面是一个可能的实现,包括字符串加法函数和字符串减法函数的定义:
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_LENGTH 100
string add(string a, string b) {
string res = "";
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int carry = 0;
for (int i = 0; i < a.length() || i < b.length() || carry; i++) {
int x = i < a.length() ? a[i] - '0' : 0;
int y = i < b.length() ? b[i] - '0' : 0;
int sum = x + y + carry;
res += (sum % 10) + '0';
carry = sum / 10;
}
reverse(res.begin(), res.end());
return res;
}
string sub(string a, string b) {
string res = "";
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int borrow = 0;
for (int i = 0; i < a.length(); i++) {
int x = a[i] - '0' - borrow;
int y = i < b.length() ? b[i] - '0' : 0;
borrow = 0;
if (x < y) {
x += 10;
borrow = 1;
}
res += (x - y) + '0';
}
while (res.length() > 1 && res.back() == '0') {
res.pop_back();
}
reverse(res.begin(), res.end());
if (borrow) {
res = "-" + res;
}
return res;
}
int main() {
string a, b, c;
cin >> a >> b >> c;
if (c == "+") {
cout << add(a, b) << endl;
} else {
cout << sub(a, b) << endl;
}
return 0;
}
```
其中,字符串加法函数 `add` 和字符串减法函数 `sub` 的实现分别如下:
- `add` 函数:将两个字符串表示的数字按位相加,得到结果的字符串表示。时间复杂度为 O(max(len(a), len(b)))。
- 首先将两个字符串翻转过来,从低位到高位依次相加,同时考虑进位。具体实现中,使用变量 `carry` 记录上一位相加的进位情况,并将 `carry` 初始化为 0。
- 对于第 i 位,取出 a[i] 和 b[i] 的数值,如果 i 超过其中一个字符串的长度,则相应的数值为 0。将两个数值加上 `carry`,得到 sum,然后将 sum 的个位数添加到结果字符串的末尾,并将进位的数值更新为 sum 的十位数。
- 最后,将结果字符串翻转回来,就得到了相加的结果。
```cpp
string add(string a, string b) {
string res = "";
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int carry = 0;
for (int i = 0; i < a.length() || i < b.length() || carry; i++) {
int x = i < a.length() ? a[i] - '0' : 0;
int y = i < b.length() ? b[i] - '0' : 0;
int sum = x + y + carry;
res += (sum % 10) + '0';
carry = sum / 10;
}
reverse(res.begin(), res.end());
return res;
}
```
- `sub` 函数:将两个字符串表示的数字按位相减,得到结果的字符串表示。时间复杂度为 O(max(len(a), len(b)))。
- 首先将两个字符串翻转过来,从低位到高位依次相减,同时考虑借位。具体实现中,使用变量 `borrow` 记录上一位相减的借位情况,并将 `borrow` 初始化为 0。
- 对于第 i 位,取出 a[i] 和 b[i] 的数值,如果 i 超过 b 的长度,则相应的数值为 0。将 a[i] 减去 `borrow`,然后减去 b[i] 得到 x,如果 x 小于 0,则需要向高位借位,将 x 加上 10,并将 `borrow` 更新为 1,否则 `borrow` 为 0。将 x 的数值添加到结果字符串的末尾。
- 在计算完所有位之后,需要去掉结果字符串的前导 0,并在最终结果前面添加负号(如果结果为负数)。具体实现中,可以利用 while 循环去掉结果字符串末尾的 0,然后将结果字符串翻转回来。如果 `borrow` 为 1,说明结果为负数,需要在最前面添加负号。
```cpp
string sub(string a, string b) {
string res = "";
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int borrow = 0;
for (int i = 0; i < a.length(); i++) {
int x = a[i] - '0' - borrow;
int y = i < b.length() ? b[i] - '0' : 0;
borrow = 0;
if (x < y) {
x += 10;
borrow = 1;
}
res += (x - y) + '0';
}
while (res.length() > 1 && res.back() == '0') {
res.pop_back();
}
reverse(res.begin(), res.end());
if (borrow) {
res = "-" + res;
}
return res;
}
```
最后,在 `main` 函数中读入两个字符串 a 和 b,以及运算符 c,如果 c 为加号,则调用 `add` 函数得到结果并输出;否则调用 `sub` 函数得到结果并输出。
阅读全文