题目链接:https://www.acwing.com/problem/content/description/794/
时/空限制:1s / 64MB

题目描述

给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤10^5

输入样例

32
11

输出样例

21

解题思路

题意:求两个大数的差。
思路:上大数减法模板,注意负数的情况。

Accepted Code:

/* 
 * @Author: lzyws739307453 
 * @Language: C++ 
 */
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
char sa[MAXN], sb[MAXN];
int vectcmp(vector <int> A, vector <int> B) {
    if (A.size() != B.size()) {
        if (A.size() > B.size())
            return 1;
        return -1;
    }
    for (int i = A.size() - 1; ~i; i--) {
        if (A[i] != B[i]) {
            if (A[i] > B[i])
                return 1;
            return -1;
        }
    }
    return 0;
}
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector <int> Sub(vector <int> A, vector <int> B) {
    vector <int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i++) {
        t = A[i] - t;
        if (i < B.size())
            t -= B[i];
        C.push_back((t + 10) % 10);
        t = t < 0;
    }
    while (C.size() > 1 && !C.back()) C.pop_back();
    return C;
}
int main() {
    vector <int> spa, spb, spc;
    scanf("%s%s", sa, sb);
    for (int i = strlen(sa) - 1; ~i; i--)
        spa.push_back(sa[i] - '0');
    for (int i = strlen(sb) - 1; ~i; i--)
        spb.push_back(sb[i] - '0');
    if (vectcmp(spa, spb) < 0) {
        spc = Sub(spb, spa);
        printf("-");
    }
    else spc = Sub(spa, spb);
    for (int i = spc.size() - 1; ~i; i--)
        printf("%d", spc[i]);
    printf("\n");
    return 0;
}