AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 792. 高精度减法    原题链接    简单

作者: 作者的头像   张大迷糊爱唠叨 ,  2021-01-14 13:22:52 ,  阅读 15


1


1

高精度减法

y总的代码可能给我带来一些理解上的困难,我这里将t分成两个不同的字符t和k,t表示进位,k表示每一位的数值,对于我来说这样更好理解一些,这里分享给大家,当然大佬可以直接忽略,哈哈!!!!

#include <iostream>
#include <vector>

using namespace std;
// 判断是否有 A >= B
bool cmp(vector<int> &A, vector<int> &B) {

    //位数不同,A的位数大就大,A的位数小就小
    if (A.size() != B.size()){

        return A.size() > B.size();
    }

    //位数相同,从高位开始比较,第一位不相等,判断A与B大小
    for (int i = A.size() - 1; i >= 0; i--){

        if(A[i] != B[i]){

            return A[i] > B[i];
        }
    }
    return true;
}
//C = A - B
vector<int> sub(vector<int> &A, vector<int> &B){

    vector<int> C;

    //从个位开始计算
    //t表示的是借位,其范围是0或1
    for (int i = 0, t = 0; i < A.size(); i++){
        //k表示每一位的数值
       int k = A[i] - t;
        if(i < B.size()){
            k -= B[i];  
        }
        /*if(k >= 0){
            return k;
        }else if(k < 0){
            return k+10;
        }*/
        //将上面合为一步骤,即(k + 10) % 10
        C.push_back((k + 10) % 10);

        if(k < 0){
            t = 1;
        }else{
            t = 0;
        }
    }

    //去掉前导零
    while (C.size() > 1 && C.back() == 0){

        C.pop_back();
    }
    return C;
}

int main(){
    string a, b;
    vector<int> A, B;

    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');

    if (cmp(A, B)){

        auto C = sub(A, B);

        for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
    }else{

        auto C = sub(B, A);

        printf("-");

        for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
    }
    return 0;
}

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息