高精度加法,减法

高精度运算:
是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。

对于一个高精度正整数,接受与存储的程序段如下:

输入处理

int na[110]={0},nb[110]={0};//用数组按位存放高精度正整数,初值全为0
int la=a.size(),lb=b.size();//高精度正整数的位数
  /***数组从右向左存储,na[0]存放个位,na[1]存放十位...***/
    for(int i=0;i<la;i++){
       na[la-1-i]=a[i]-'0';
    }
    for(int i=0;i<lb;i++){
        nb[lb-1-i]=b[i]-'0';
    }

相加

 int lmax=la>lb?la:lb;//选取最长长度开始相加
 for(int i=0;i<lmax;i++){
    na[i]+=nb[i];  //两数相加
    na[i+1]+=na[i]/10;//要进的位
    na[i]%=10;//进位后的数
    }
    //如果最高位大于10,即na[lmax-1+1]=1;lmax++
    if(na[lmax]){
     lmax++;//位数加1
    }

处理最高进位

例如:当输入为00006 00003时

    for(int i=lmax-1;i>=0;i--){
        if(na[lmax-1]==0)
            lmax--;
    }

输出结果

 for(int i=lmax-1;i>=0;i--){
        ans+=na[i]+'0';//从高位到低位依次给字符串ans
    }

完整代码


#include<bits/stdc++.h>
using namespace std;
const int L=110;
//两个非负整数相加
//方法 倒置相加再还原
string add(string a,string b){
    string ans;
    int na[L]={0},nb[L]={0};
    int la=a.size(),lb=b.size();
    //倒置
    for(int i=0;i<la;i++){
       na[la-1-i]=a[i]-'0';
    }
    for(int i=0;i<lb;i++){
        nb[lb-1-i]=b[i]-'0';
    }
    //选取最长长度开始相加
    int lmax=la>lb?la:lb;
    for(int i=0;i<lmax;i++){
    na[i]+=nb[i];
    na[i+1]+=na[i]/10;
    na[i]%=10;

    }
    //如果最高位大于10,即na[lmax-1+1]=1;lmax++
    if(na[lmax]){
     lmax++;
    }
    /***第一次没有处理高位为0d的情况***/
    for(int i=lmax-1;i>=0;i--){
        if(na[lmax-1]==0)
            lmax--;
    }
    //还原
    for(int i=lmax-1;i>=0;i--){
        ans+=na[i]+'0';
    }
    return ans;
}


int main(){
//高精度加法
//用tring 类型传入参数  算法复杂度  O(n)
  string a,b;
 while(cin>>a>>b){
        cout<<add(a,b)<<endl;
  }
return 0;
}

减法运算同理

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int L=110;
string sub(string a,string b){
string ans;
int na[L]={0},nb[L]={0};
int la=a.size(),lb=b.size();
int lmax=la>lb?la:lb;
for(int i=0;i<la;i++){
    na[la-1-i]=a[i]-'0';
}
for(int i=0;i<lb;i++){
    nb[lb-1-i]=b[i]-'0';
}
for(int i=0;i<lmax;i++){
    na[i]=na[i]-nb[i];
    if(na[i]<0){
        na[i]=na[i]+10;
        na[i+1]--;
    }
}
for(int i=lmax-1;i>=0;i--){
    if(na[lmax-1]==0){
        lmax--;
    }
}
for(int i=lmax-1;i>=0;i--){
    ans+=na[i]+'0';
}
return ans;
}
int main(){
int T;
string a,b;
scanf("%d",&T);
while(T--){
    cin>>a>>b;
    cout<<sub(a,b)<<endl;
}
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值