c++高精度减法(超详细,有模拟样例和注解)

原题链接 AcWing 792. 高精度减法
同高精度加法一样,c++也不支持高精度减法

高精度减法,同高精度加法一样,利用数组保存每位数字

这里我们给出112-99=13举例讲解sub函数部分

请同时结合代码体会下面的讲解,不然是看不懂的

1 第一步

最初 t=0 然后 t = a[0] - 0 = 2

然后 t -= b[0] 即t = 2 - 9 = -7

接下来取模,取模是为了将负数变为正数

(-7+10)%10 =3

所以sum[0] = 3

此时因为 t= -7 < 0 所以说明 本次运算向上借位了,所以要将t赋值为1

2 第二步

因为上一步借位了,所以t开始等于1;

t=a[1]-t= 1-1 =0

然后 t -= b[1] = -9

(-9+10)%10 = 1

sum[1] = 1

因为t= -9<0 说明向百位借位了

所以 t 赋值为 1

3 第三步

t = a[2]-t = 1 -1 =0

因为此时b数组已经没有数字了,所以不在参与运算

(0+10)%10 = 0

所以sim[2] = 0

退出循环

然后去掉前导零

//高精度减法模板函数
void sub(v &a, v &b){
    int t=0;//记录进位情况;
    for(int i=0;i<a.size();i++){
        t=a[i]-t;
        if(i<b.size())t-=b[i];//防止越界
        sum.push_back((t+10)%10);//若t小于零,则加十取模为正的,因为借位了
        if(t<0)t=1;//t小于0说明不够减的,说明借位了,算下一位是要把借的位减去
        else t=0;
    }
    //要去掉它的前导零
    //若是答案就是0 就不用去掉了
    while(sum.size()>1&&sum.back()==0)sum.pop_back();
}

这是完整代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>

using namespace std;
typedef vector<int > v;

string s1,s2;//读入的数字字符串

vector<int >sum; //保存最后答案

bool cmp(v &a,v &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];
    }
    //若是两数字相等,返回true
    return true;
}

// sum = a - b;
void sub(v &a, v &b){
    int t=0;//记录进位情况;
    for(int i=0;i<a.size();i++){
        t=a[i]-t;
        if(i<b.size())t-=b[i];//防止越界
        sum.push_back((t+10)%10);//若t小于零,则加十取模为正的,因为借位了
        if(t<0)t=1;//t小于0说明不够减的,说明借位了,算下一位是要把借的位减去
        else t=0;
    }
    //要去掉它的前导零
    //若是答案就是0 就不用去掉了
    while(sum.size()>1&&sum.back()==0)sum.pop_back();
}

int main(){
    
    cin>>s1>>s2;
    
    vector<int >a,b;//被减数和减数
    
    for(int i=s1.size()-1;i>=0;i--)a.push_back(s1[i]-'0');
    for(int i=s2.size()-1;i>=0;i--)b.push_back(s2[i]-'0');
    
    //如果a>b
    if(cmp(a,b)){
        sub(a,b);
        for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
    }
    //b>a
    else{
         sub(b,a);
        cout<<'-';
        for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
    }
   return 0;
    
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海风许愿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值