本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。用指针
时间: 2024-03-16 20:44:54 浏览: 105
C++中超长数类型的构造与实现
好的,我将为您提供一个简单的代码示例。本示例中,我们将使用字符串表示超长整数,并实现加法和减法运算。
示例代码如下:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 函数声明
char* add(char* num1, char* num2);
char* sub(char* num1, char* num2);
int main()
{
char num1[1000], num2[1000], op;
char* result;
// 读取输入数据
scanf("%s %c %s", num1, &op, num2);
// 根据运算符进行计算
if (op == '+')
{
result = add(num1, num2);
}
else if (op == '-')
{
result = sub(num1, num2);
}
else
{
printf("Error: invalid operator\n");
return 1;
}
// 输出结果
printf("%s\n", result);
// 释放内存
free(result);
return 0;
}
// 实现加法运算
char* add(char* num1, char* num2)
{
int len1 = strlen(num1);
int len2 = strlen(num2);
// 为结果分配足够的空间
int maxlen = len1 > len2 ? len1 : len2;
char* result = (char*)malloc(sizeof(char) * (maxlen + 2));
int carry = 0;
int i = len1 - 1;
int j = len2 - 1;
int k = 0;
while (i >= 0 || j >= 0)
{
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int sum = x + y + carry;
result[k++] = sum % 10 + '0';
carry = sum / 10;
i--;
j--;
}
if (carry > 0)
{
result[k++] = carry + '0';
}
result[k] = '\0';
// 反转结果字符串
int n = strlen(result);
for (int i = 0; i < n / 2; i++)
{
char temp = result[i];
result[i] = result[n - i - 1];
result[n - i - 1] = temp;
}
return result;
}
// 实现减法运算
char* sub(char* num1, char* num2)
{
int len1 = strlen(num1);
int len2 = strlen(num2);
// 为结果分配足够的空间
int maxlen = len1 > len2 ? len1 : len2;
char* result = (char*)malloc(sizeof(char) * (maxlen + 2));
int borrow = 0;
int i = len1 - 1;
int j = len2 - 1;
int k = 0;
while (i >= 0 || j >= 0)
{
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
int diff = x - y - borrow;
if (diff < 0)
{
diff += 10;
borrow = 1;
}
else
{
borrow = 0;
}
result[k++] = diff + '0';
i--;
j--;
}
// 去掉前导零
while (k > 1 && result[k - 1] == '0')
{
k--;
}
result[k] = '\0';
// 反转结果字符串
int n = strlen(result);
for (int i = 0; i < n / 2; i++)
{
char temp = result[i];
result[i] = result[n - i - 1];
result[n - i - 1] = temp;
}
return result;
}
```
该程序中,我们使用了两个函数add和sub来实现加法和减法运算。这两个函数的实现方式类似,都是通过从低位到高位逐位计算,然后将结果反转得到最终结果。
在add函数中,我们使用了一个carry变量来保存进位,每次计算时将carry加到当前位的和中,并将结果除以10得到当前位的值。在sub函数中,我们使用了一个borrow变量来保存借位,每次计算时将borrow减去当前位的差中,并将结果加上10得到当前位的值。
请注意,由于我们使用了动态内存分配,因此需要在使用完毕后及时释放分配的内存,以避免内存泄漏。
阅读全文