还有两数相减的代码
时间: 2023-07-10 17:22:55 浏览: 54
将两个大整数的减法转化为加法,即 a - b = a + (-b),其中 -b 为 b 的每一位取 10 之后再减去原数。下面是完整的代码实现:
```
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000 // 数组最大长度
int a[MAX_LEN], b[MAX_LEN], c[MAX_LEN]; // 定义三个数组,a、b为输入的两个大整数,c为它们的差
void add(int a[], int b[], int c[]) // 定义一个函数,实现两个大整数相加
{
int carry = 0; // 进位
for (int i = 0; i < MAX_LEN; i++)
{
int sum = a[i] + b[i] + carry; // 计算第i位的和
c[i] = sum % 10; // 取个位数,存储在c数组中
carry = sum / 10; // 计算新的进位
}
c[MAX_LEN] = carry; // 如果最高位有进位,将其保存在a的最高位
}
int main()
{
char str_a[MAX_LEN], str_b[MAX_LEN]; // 定义两个字符串,用于输入两个大整数
scanf("%s %s", str_a, str_b); // 输入两个大整数
int len_a = strlen(str_a), len_b = strlen(str_b); // 计算两个大整数的长度
for (int i = 0; i < len_a; i++)
a[i] = str_a[len_a - 1 - i] - '0'; // 将a字符串转化为a数组,从低到高存储
for (int i = 0; i < len_b; i++)
b[i] = str_b[len_b - 1 - i] - '0'; // 将b字符串转化为b数组,从低到高存储
int sign = 1; // 符号标记,1为正数,-1为负数
if (len_a < len_b || (len_a == len_b && strcmp(str_a, str_b) < 0)) // 判断减数和被减数的大小关系
{
sign = -1; // 如果b大于a,则差为负数
int *temp = a; // 交换a和b
a = b;
b = temp;
int temp_len = len_a; // 交换a和b的长度
len_a = len_b;
len_b = temp_len;
}
for (int i = 0; i < len_b; i++)
b[i] = (b[i] + 10) % 10; // 将b的每一位取10之后再减去原数,得到-b的每一位
add(a, b, c); // 调用add函数,计算a和-b的和
int len_c = MAX_LEN;
while (len_c > 1 && c[len_c - 1] == 0) // 去掉c数组前导0
len_c--;
if (sign == -1)
printf("a - b = -"); // 如果差为负数,输出负号
else
printf("a - b = ");
for (int i = len_c - 1; i >= 0; i--)
printf("%d", c[i]); // 输出a和-b的和,从高到低输出即可
printf("\n");
return 0;
}
```
这段代码实现了两个大整数的减法,首先将输入的两个大整数转化为数组,然后判断减数和被减数的大小关系,如果b大于a,则差为负数,需要在最前面输出一个负号。接着,将b的每一位取10之后再减去原数,得到-b的每一位,然后调用add函数计算a和-b的和。最后,输出a和-b的和,从高到低输出即可。