• (高精度)大数加减法C++实现


    前言

    这两天在刷算法题,其中涉及到了高精度算法,由于笔者使用C++,所以需要手动去模拟实现。使用java和python的同学可以不用担心,Java有BigDecimal类可以实现,python可以直接实现。

    好了下面我们直接上代码,代码都有相应的注释,相信可以看懂的。

    代码

    #include <iostream>
    #include <vector>
    #include <cstdio>
    using namespace std;
    
    //比较两个数的大小
    bool checkSize(vector<int> &A,vector<int> &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 true;
                break;
            }
            if(A[i]<B[i])
            {
                return false;
                break;
            }
        }
        return true;
    }
    
    //加法
    vector<int> add(vector<int> &A,vector<int> &B)
    {
        vector<int> C;
        int t=0;
        for(int i=0;i<A.size()|| i<B.size();i++)
        {
            if(i<A.size()) t+=A[i];
            if(i<B.size()) t+=B[i];
            C.push_back(t % 10);
            t /= 10;
        }
        if(t!=0) C.push_back(1);
        return C;
    }
    
    //减法
    vector<int> sub(vector<int> &A,vector<int> &B)
    {
        vector<int> C;
        int t=0;
        for(int i=0;i<A.size();i++)
        {
            t=A[i]-t;
            if(i<B.size()) t-=B[i];
            C.push_back((t+10)%10);
            if(t<0) t=1;
            else t=0;
        }
        //去除前导0
        while(C.size()>1 && C.back()==0) C.pop_back();
        return C;
    }
    
    int main()
    {
        string a,b,op;
        vector<int> A,B;
        cin >> a >> op >>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(op=="add")
        {
            vector<int> C = add(A,B);
            for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
        }
        if(op=="sub")
        {
            vector<int> C;
            if(checkSize(A,B))
            {
                C= sub(A,B);
                for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
            }
            else
            {
                C = sub(B,A);
                cout << "-";
                for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
            }
        }
        return 0;
    }
    

    更多内容大家可以访问我的个人博客:一只大大怪

  • 相关阅读:
    Roles in graphs
    COMMUNITY DETECTION
    jquery官方API
    react打包后引入
    pc网站相互跳转
    动画点击事件
    导入组件
    纯css制作loading效果
    canvas时钟
    canvas实现动画 地球绕太阳公转 月球绕地球公转
  • 原文地址:https://www.cnblogs.com/cydi/p/12468400.html
Copyright © 2020-2023  润新知