高精度加减运算c++

该博客介绍了如何使用C++实现高精度的加法和减法运算。通过字符串处理,实现了大整数的加法和减法,包括位数比较、借位等操作,并给出了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//高精度加法运算
#include<bits/stdc++.h>
using namespace std;
//return a+b;
string Add(string A,string B)
{
    int LA=A.length();
    int LB=B.length();

    string c(max(LA,LB)+1,'0');

    for(int i=0;i<c.length();i++)
    {//将string A,B每一位取出
        int a=0;
        if(i<LA)//不能越界
            a=A[LA-i-1]-'0';//存入时,是char型,所以-'0'转换

        int b=0;
        if(i<LB)
            b=B[LB-i-1]-'0';

        //计算个位取余,计算十位取整
        c[i]=(c[i]-'0'+a+b)%10+'0';//a1+b1结果为int型,而c[i]为char型,故加减'0'进行转换
        c[i+1]=(c[i]-'0'+a+b)/10+'0';
    }
        //若最后一个字符为0,去除;再进行字符串反转
        if(c[c.length()-1]=='0')
            c=c.substr(0,c.length()-1);//取子字符串,从0开始,到c.length()-1
        //反转
        /*string ans;
        for(int i=c.length()-1;i>=0;i--)
            ans=ans+c[i];
        return ans;
        */
        reverse(c.begin(),c.end());
        return c;
}
int main()
{
    string A="11111111111111111111111111111111111";
    string B="11222222222222222222222222222222222";

    cout << "A+B="<<Add(A,B) << endl;
    return 0;
}
//高精度减法
//先比较A,B的大小。比大小中,先比较位数;位数相同则比较每一位的大小
int compare(string A,string B)
{
    int LA=A.length();
    int LB=B.length();

    if(LA>LB)return 1;
    if(LA<LB)return -1;

    for(int i=0;i<LA;i++)//LA=LB位数相同则比较每一位的大小
    {
        if(A[i]>B[i])return 1;
        if(A[i]<B[i])return -1;
    }
    return 0;//A==B
}
string Minus(string A,string B)
{
    if(compare(A,B)==0)return "0";

    int LA=A.length();
    int LB=B.length();

    string c(max(LA,LB),'0');
    if(compare(A,B)==1)
    {
        for(int i=0;i<LA;i++)
        {//取出每一位
            int a=A[LA-i-1]-'0';
            int b=(i<LB)?B[LB-i-1]-'0':0;//为避免溢出,先判断i是否<LB,若不是,则将大于的部分补0

            if(a>=b)//不需要借位
            {
                c[i]=a-b+'0';
            }else{//向高位借位(需要循环),A[i+1]发生变化
                    c[i]=10+a-b+'0';
                    for(int j=i;j<LA-1;j++)//借位的界限到LA-1(不能为0)
                    {
                        if(A[LA-j-2]==0)A[LA-j-2]='9';//高位是前一位,即A[LA-j-2]
                        else A[LA-j-2]--;break;
                    }
                 }
        }
    }
    else{
        return "-"+Minus(B,A);
    }
    reverse(c.begin(),c.end());
    //去掉首位的0
    for(int i=0;i<c.length();i++)
    {
        if(c[i]!='0')
        {c=c.substr(i,LA-i);break;}
    }
    return c;
}
int main()
{
    string A="9";
    string B="1000";
    cout<<"A-B="<<Minus(A,B)<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值