对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输
时间: 2023-07-20 20:17:44 浏览: 208
好的,我的回答如下:
对于这个问题,你可以使用以下函数来实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *add(char *a, char *b) {
int i, j, k, lena, lenb, temp, carry = 0;
char *result;
lena = strlen(a);
lenb = strlen(b);
result = (char *)malloc((lena > lenb ? lena : lenb) + 2);
for (i = lena - 1, j = lenb - 1, k = 0; i >= 0 || j >= 0 || carry; i--, j--, k++) {
temp = carry;
if (i >= 0) {
temp += a[i] - '0';
}
if (j >= 0) {
temp += b[j] - '0';
}
result[k] = temp % 10 + '0';
carry = temp / 10;
}
result[k] = '\0';
// 翻转字符串
for (i = 0, j = strlen(result) - 1; i < j; i++, j--) {
temp = result[i];
result[i] = result[j];
result[j] = temp;
}
return result;
}
char *sub(char *a, char *b) {
int i, j, k, lena, lenb, temp, borrow = 0;
char *result;
lena = strlen(a);
lenb = strlen(b);
result = (char *)malloc((lena > lenb ? lena : lenb) + 2);
for (i = lena - 1, j = lenb - 1, k = 0; i >= 0 || j >= 0; i--, j--, k++) {
temp = borrow;
if (i >= 0) {
temp += a[i] - '0';
}
if (j >= 0) {
temp -= b[j] - '0';
}
if (temp < 0) {
temp += 10;
borrow = -1;
} else {
borrow = 0;
}
result[k] = temp + '0';
}
while (k > 1 && result[k - 1] == '0') {
k--;
}
result[k] = '\0';
// 翻转字符串
for (i = 0, j = strlen(result) - 1; i < j; i++, j--) {
temp = result[i];
result[i] = result[j];
result[j] = temp;
}
return result;
}
int main() {
char a[101], b[101], op;
char *result;
printf("请输入两个超长整数和运算符(+或-):\n");
scanf("%s %s %c", a, b, &op);
if (op == '+') {
result = add(a, b);
} else if (op == '-') {
result = sub(a, b);
} else {
printf("无效的运算符!\n");
return 1;
}
printf("运算结果为:%s\n", result);
free(result); // 释放动态分配的内存空间
return 0;
}
```
这个程序的实现原理是,首先定义了两个函数 `add` 和 `sub`,分别用于实现加法和减法运算。这两个函数都接收两个字符串参数,分别表示需要进行运算的两个超长整数。
在 `add` 函数中,首先计算出两个字符串的长度,然后动态分配足够的内存空间来存储运算结果。接着,从字符串末尾开始遍历两个字符串,依次取出每个字符并转换为数字,进行加法运算,并将结果存储在结果字符串中。最后,将结果字符串翻转并返回。
在 `sub` 函数中,实现了字符串的减法运算。与加法运算类似,也是从字符串末尾开始遍历两个字符串,依次取出每个字符并转换为数字,进行减法运算,并将结果存储在结果字符串中。需要注意的是,需要处理借位的情况,并且在得到结果后需要去掉前导0。最后,将结果字符串翻转并返回。
在 `main` 函数中,首先读入两个超长整数和运算符。然后根据运算符调用对应的函数进行运算,并将结果输出。需要注意的是,需要在程序结束前释放动态分配的内存空间。
使用示例:
```
请输入两个超长整数和运算符(+或-):
123456789012345678901 + 123
运算结果为:123456789012345679024
```
阅读全文