题目(高精度 高精度 高精度...)
已知两个数A和B,求A-B的运算结果。
学习心得
(来自老师的熏陶)
主要思路:
我们要从低位开始减。
步骤:
首先比较减数和被减数的大小。当减数和被减数位数不同时可以直接判断两数大小;如果两数位数相同时,则比较字符串的大小。(strcmp实现)
然后处理每一位相减,要考虑前一位相减是否有借位,有借位则需要减去借位,无则不减。
再去判断是否够减,如果不够减,就要借位后再去减,同时置借位为1,否则置借位为0。
代码
#include <bits/stdc++.h>
using namespace std;
#define MAXN 20000
char s1[MAXN], s2[MAXN], tmp[MAXN];
int a[MAXN], b[MAXN], c[MAXN];
int main() {
scanf("%s %s", s1, s2);
int lena = strlen(s1);
int lenb = strlen(s2);
if ((lena<lenb) || (lena==lenb && strcmp(s1,s2)<0)) {
printf("-");
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);
lena = strlen(s1);
lenb = strlen(s2);
}
for (int i=0; i<lena; i++) {
a[i] = s1[lena-i-1] - '0';
}
for (int i=0; i<lenb; i++) {
b[i] = s2[lenb-i-1] - '0';
}
for (int i=0; i<lena; i++) {
if (a[i]<b[i]) {
a[i+1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
for (int i=lena-1; i>=0; i--) {
if (c[i]==0 && lena>1) {
lena--;
} else {
break;
}
}
for (int i=lena-1; i>=0; i--) {
printf("%d", c[i]);
}
printf("
");
return 0;
}