• 再次学习高精度


    高精度加法

    需要注意不能返回string&,不能返回vector&
    接收的类型必须是string和vector,不能使用&进行接收

    #include
    #include
    #include
    #include
    using namespace std;
    
    string Add(string& a,string& b)
    {
        string ans;
        int t=0;
        for(int i=0;i<max(a.size(),b.size())|| t; i++)
        {
            if(i<a.size()) t+=a[i]-'0';
            if(i<b.size()) t+=b[i]-'0';
            ans+=t%10+'0';
            t/=10;
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
    int main()
    {
        string a,b;
        cin>>a>>b;
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        
        string ans=Add(a,b);
        cout<<ans<<endl;
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    #include
    #include
    #include
    using namespace std;
    
    vector<int> Add(vector<int>& a,vector<int>& b)
    {
        vector<int> c;
        int t=0;
        for(int i=0;i<max(a.size(),b.size());i++)
        {
            if(i<a.size()) t+=a[i];
            if(i<b.size()) t+=b[i];
            c.push_back(t%10);
            t/=10;
        }
        reverse(c.begin(),c.end());
        return c;
    }
    int main()
    {
        string a,b;
        cin>>a>>b;
        vector<int> c,d;
        for(int i=a.size()-1;~i;i--) c.push_back(a[i]-'0');
        for(int j=b.size()-1;~j;j--) d.push_back(b[j]-'0');
        
        vector<int> ans=Add(c,d);
        
        for(auto n:ans)
            printf("%d",n);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    高精度减法

    一定要先判断a,b的大小,如果是a小于b,用大减小然后加±号

    #include
    #include
    #include
    using namespace std;
    
    string sub(string& a,string& b)
    {
        //a>=b
        string c;
        int t=0;//记录借位  
        
        int flag=0;//记录是否为负数
        for(int i=0;i<a.size();i++)
        {
            int tem=-t;
            tem+=(a[i]-'0');
            if(i<b.size()) tem-=b[i]-'0'; 
            if(tem<0) t=1;
            else t=0;
            c+=(tem+10)%10+'0';
        }
        while(c.size()>1 && c.back()=='0') c.pop_back();
        
        reverse(c.begin(),c.end());
        return c;
    }
    bool cmp(string& a,string& b)
    {
        if(a.size()==b.size())
        {
            for(int i=0;i<a.size();i++)
                if(a[i]!=b[i]) return a[i]>b[i];
            return true;
        }
        return a.size()>b.size();
    }
    int main()
    {
        string a,b;
        cin>>a>>b;
        //先判断大小
        //如果是边计算便判断大小,那就不符合计算规则了
        //计算规则是从个位开始加减,如果a是小于b的,需要用大减小
        //不论怎么实现都是需要进行这一步操作的
        char c='+';
        if(!cmp(a,b)) 
        {
            string tem=a;
            a=b;
            b=tem;
            c='-';
        }
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
    
        string ans=sub(a,b);
        if(c=='-') printf("-");
        cout<<ans<<endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    高精度乘法

    小心12345678*0这种情况,这种情况会出现n个0的情况,我们需要将这些0进行删除
    并且要注意string转int需要减去‘0’

    #include
    #include
    #include
    #include
    using namespace std;
    
    vector<int> mul(vector<int>& a,int b)
    {
        vector<int> c;
        
        int t=0;//记录总和
        for(int i=0;i<a.size()||t;i++)
        {
            if(i<a.size()) t+=a[i]*b;
            c.push_back(t%10);
            t/=10;
        }
        while(c.size()>1 && c.back()==0) c.pop_back();
        reverse(c.begin(),c.end());
        return c;
    }
    
    int main()
    {
        string a;
        int b;
        cin>>a>>b;
        vector<int> c;
        for(int i=a.size()-1;~i;i--) c.push_back(a[i]-'0');
        
        auto ans=mul(c,b);
        for(auto u:ans)
            printf("%d",u);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    高精度除法

    #include
    #include
    #include
    #include
    using namespace std;
    
    typedef pair<vector<int>,int> PVI;
    
    PVI div(vector<int>& a,int b)
    {
        vector<int> c;
        int t=0;
        for(int i=0;i<a.size();i++)
        {
            t=t*10+a[i];
            c.push_back(t/b);
            t%=b;
        }
        reverse(c.begin(),c.end());
        while(c.size()>1 && c.back()==0) c.pop_back();
        reverse(c.begin(),c.end());
        PVI ans({c,t});
    
        return ans;
    }
    
    int main()
    {
        string a;
        int b;
        cin>>a>>b;
        vector<int> c;
        for(int i=0;a[i];i++) c.push_back(a[i]-'0');
    
        auto ans=div(c,b);
        for(auto u:ans.first)
            printf("%d",u);
        cout<<endl<<ans.second<<endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    (附源码)springboot流浪动物救助系统 毕业设计 180920
    JSP通用材料收集归档系统eclipse定制开发mysql数据库BS模式java编程jdbc
    openmp 通用核心 学习 1
    springboot2.6.1导出xlsx表格
    《优化接口设计的思路》系列:第七篇—接口限流策略
    LeetCode-764. 最大加号标志【动态规划,二维数组】
    y82.第四章 Prometheus大厂监控体系及实战 -- 监控扩展和prometheus 联邦(十三)
    YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.77】引入百度最新提出RT-DETR模型中AIFI模块
    使用Docker快速连接远程Mysql
    【水滴计划】:盛最多水的容器、移除元素
  • 原文地址:https://blog.csdn.net/2201_76033304/article/details/134454668