高精度加减法

1.加法

以字符串形式输入,然后逆向存在初始值为0的数组中。做加法运算时,先初始化进位标志为0。从低位到高位,res[i]=(a[i]+b[i]+carry)%10; carry=(a[i]+b[i]+carry)/10;循环次数为最长的数字位数(因为已经初始化为0,继续进行加法不会影响结果)

例:

题目描述

输入两个大整数a和b,输出这两个整数的和。a和b都不超过100位。 

输入格式

输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出格式

输出一行,表示a + b的值。

输入样例

20100122201001221234567890
2010012220100122

输出样例

20100122203011233454668012
#include<bits/stdc++.h>
using namespace std;
int main(){
    string a,b;
    int carry=0;
    cin>>a>>b;
    int la=a.size();
    int lb=b.size();
    int a1[500]={0},b1[500]={0};
    for(int i=0;i<la;i++){
        a1[a.size()-1-i]=a[i]-'0';
    }
    for(int j=0;j<lb;j++){
        b1[b.size()-1-j]=b[j]-'0';
    }
    if(la>=lb){
        for(int i=0;i<la;i++){
            int r=a1[i];
            a1[i]=(b1[i]+a1[i]+carry)%10;
            carry=(b1[i]+r+carry)/10;
        }
        if(carry){
            a1[la]=carry;
        }
        else la--;
        for(int k=la;k>=0;k--){
            cout<<a1[k];
        }
        cout<<endl;
        return 0;
    }
    else{
        for(int i=0;i<lb;i++){
            int r=b1[i];
            b1[i]=(b1[i]+a1[i]+carry)%10;
            carry=(a1[i]+r+carry)/10;
        }
        if(carry>0){
            b1[lb]+=carry;
        }
        else lb--;
        for(int i=lb;i>=0;i--){
            cout<<b1[i];
        }
        cout<<endl;
        return 0;
    }
}

 2.减法

减法的坑比加法多。(1)做减法运算前判断两个数的大小关系,习惯上使第一个数更大,若A<B,则使用swap函数交换两数,并做标记,以便结果输出的时候加上负号。ps:判断两数大小:若两个数位数相同,且字符串A<B,则A<B;若A的数位比B短,则A<B。(2)借位的表示 若第一个数位不够减,则从更高一位借10,加到该位上,同时高位-1。运算循环次数同样为较长的数的位数,因为已经初始化为0。(3)输出时前导0的处理。从高位到低位依次判断,若该位为0,则结果数组的长度-1,直到第一个不为0的数位为止。如果结果数组的长度已经变为0,则直接输出0,结束算法。

例:

题目描述

输入两个大整数a和b,输出这a-b的结果。a和b都不超过100位。 

输入格式

输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出格式

输出一行,表示a - b的值。

输入样例 

111111111111111111111111
111111111111111111111111

输出样例 

0

数据范围与提示

结果可能为负数

 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string a,b;
    bool flag=0;
    cin>>a>>b;
    int la=a.size(),lb=b.size();
    int a1[500]={0},b1[500]={0},ans[500]={0};
 
    if(a.size()==b.size()&&a<b||a.size()<b.size())
    {
        flag=1;
        swap(a,b);
    }
    la=a.size();lb=b.size();
    for(int i=0;i<la;i++){
        a1[i]=a[la-1-i]-'0';
    }
    for(int i=0;i<lb;i++){
        b1[i]=b[lb-1-i]-'0';
    }    
    //cout<<a.size()<<" "<<b.size()<<endl;
    if(la>=lb){
        for(int i=0;i<la;i++){
            if(a1[i]<b1[i]){
                a1[i+1]--;
                a1[i]+=10;
                 
            }
            ans[i]=a1[i]-b1[i];
        }
    }
    if(flag==1) cout<<"-";
    while(ans[la-1]==0) la--;
    if(la<=0) {cout<<"0"<<endl;
    return 0;}
    for(int i=la-1;i>=0;i--){
        cout<<ans[i];
    }
    cout<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值