题目链接

AcWing 792.高精度减法

引用

数组实现的看一看下面引用的题解;也有Java的实现方法,虽然Java有大数类;对压位感兴趣的小伙伴也可以看看

师大专升本16级学长 AcWing 792. 高精度减法(C语言新手版)

jasonlin AcWing 792. 高精度减法

小呆呆 AcWing 792. 高精度减法

Accepting AcWing 792. 高精度减法(压位)

题目描述

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

样例

输入格式

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

输出格式

共一行,包含所求的差。

数据范围

11051≤整数长度≤105

输入样例:

32
11

输出样例:

21

算法

(高精度减法) O(n)O(n)

高精度减法和加法区别不大,存储的时候我们也是倒序存入数组中,因为我们都知道,减法的过程中是会向前借位的,同样的,如果最高位是1,借位后为0,那么我们就不能够直接输出数组元素,必须先去掉前导零;还有就是因为减法是会产生负数,所以在计算之前我们应该先比较两个数的大小,通过数组长度以及从最高位开始对应位的大小;还有就是借位了,有一个很巧妙的计算借位相减后的数字, (t + 10) % 10 怎么理解呢, t存的是对应位相减的结果无论结果是正数还是负数,计算后都会得到正确的结果,然后根据t是否大于零来判断是否借位了。

负数记得输出负号哦~~~

时间复杂度 O(n)O(n)

根据数的长度决定循环的次数,所以时间复杂度也是线性的

C++ 代码

#include <iostream>
#include <vector>

using namespace std;

vector<int> A , B;
string a , b;

bool cmp(vector<int> &A , vector<int> &B)
{
    if(A.size() != B.size()) return A.size() > B.size();

    for(int i = A.size() - 1; i >= 0; i --) 
        if(A[i] != B[i]) return A[i] > B[i];

    return true;
}

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);
        if(t < 0) t = 1;
        else t = 0;
    }

    while(C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}

int main()
{
    cin >> a >> b;
    
    for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
    for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0');

    vector<int> C;
    if(cmp(A , B)) C = sub(A , B);
    else C = sub(B , A) , cout << '-';

    for(int i = C.size() - 1; i >= 0; i --) cout << C[i];

    return 0;
}