2020/3/7 A-B

题目(高精度 高精度 高精度...)

已知两个数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("\n");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/CNLLB/p/12438671.html
A-B
今日推荐