#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 2021
int a[MAX];
int b[MAX];
char a1[MAX];
char b1[MAX];
int c[MAX];
int main()
{
scanf("%s\n%s", a1, b1);
int i = 0;
int la = strlen(a1);
int lb = strlen(b1);
for (i = 0; i < la; i++)a[la - 1 - i] = a1[i] - 48;
for (i = 0; i < lb; i++)b[lb - 1 - i] = b1[i] - 48;
int m = la > lb ? la:lb;//减后的位数不超过a和b的最大位次。如最大的三位数*最小的两位数,不过是999-99=900,3位数。其他的类似推理可得
for (int i = 0; i < m; i++) {
c[i] += a[i] - b[i];
if (c[i] < 0) {
c[i + 1]--;//借位
c[i] += 10;
}
}
if (c[m] == -1) {//说明a是小数,b是大数,但此处模拟的借位只有在大数减小数时才正确,所以得清0重新算;
memset(c, 0, sizeof(c));
for (int i = 0; i < m; i++) {
c[i] += b[i] - a[i];//换成大数减小数
if (c[i] < 0) {
c[i + 1]--;//借位
c[i] += 10;
}
}printf("-");//a-b为负,先输出负号
}
while (c[m] == 0 && m >= 1)m--;//去除前导0
for (i = m; i >= 0; i--)printf("%d", c[i]);
return 0;
}
A-B Problem 高精度减法(C语言)AC代码和注释
最新推荐文章于 2023-12-16 13:32:39 发布