• 高精度加减法模板(Acwing.791.792)


    首先讲一下大数相加其实代码模拟的过程就是模拟小学的加法法则。因为C语音的LL double等太少不能求位数过多的加减法。

    下面让我们一起分析一下代码

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 vector<int> add(vector<int> &A,vector<int> &B)
     6 {
     7     vector<int>res;
     8     int t=0;//t代表是否进位
     9     for(int i=0;i<A.size()||i<B.size();i++)
    10     {
    11         if(i<A.size())t+=A[i];
    12         if(i<B.size())t+=B[i];
    13         res.push_back(t%10);
    14         t=t/10;
    15     }
    16     if(t) res.push_back(1);//这里需要明白如果两个数相加最后一位还是进位了需要输出他
    17     return res;
    18 }
    19 int main()
    20 {
    21     string a,b;
    22     cin>>a>>b;
    23     vector<int>A,B;
    24     for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//逆序存入
    25     for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
    26     auto C=add(A,B);//auto 会优先匹配C是什么类型
    27     for(int i=C.size()-1;i>=0;i--) cout<<C[i]; 倒叙输出
    28     return 0;
    29 }

    然后我们再讲一下大数相减。同样模拟的是小学的运算法则。

    #include<iostream>
    #include<vector>
    using namespace std;
    bool cmp(vector<int>&A,vector<int>&B)//比较函数
    {
        if(A.size()!=B.size())return A.size()>B.size();位数不同贼输出较长的那个数组
        else{
            for(int i=A.size()-1;i>=0;i--)//位数相同则输出先比较大的那个数
            {
                if(A[i]!=B[i])return A[i]>B[i];
            }
        }
        return true; 如果前面都没输出说明两个数相同,那么谁减谁都一样
    }
    vector<int> sub(vector<int>&A,vector<int>&B)
    {
        vector<int>res;
        for(int i=0,t=0;i<A.size();i++)//这里的t同样代表进位C=A-B-t;
        {
            t=A[i]-t; //此处模拟的就是减法的运算法则
            if(i<B.size())t=t-B[i];
            res.push_back((t+10)%10);
            if(t<0)t=1;
            else t=0;
        }
        while(res.size()>1&&res.back()==0)res.pop_back();
        return res;
    }
    int main()
    {
        string a,b;
        cin>>a>>b;
        vector<int>A,B,C;
        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(cmp(A,B))//这里需要比较A和B的大小,如果A大那么就正常减
        {
             C=sub(A,B);
            for(int i=C.size()-1;i>=0;i--) cout<<C[i];
        }
        else{
             C=sub(B,A);//如果B大那么就要先输出一个-号,改成B-A就行 A-B=-(B-A)就是这个道理
            cout<<"-"<<endl;
            for(int i=C.size()-1;i>=0;i--) cout<<C[i];
        }
        return 0;
    }
  • 相关阅读:
    UIProgressView的详细使用
    Android拍照上传代码样例
    UILabel的详细使用及特殊效果
    TextView属性android:ellipsize实现跑马灯效果
    Android中WebView实现Javascript调用Java类方法
    有效获取状态栏(StatusBar)高度
    详解iPhone Tableview分批显示数据
    TextView显示插入的图片
    ObjectiveC语法快速参考
    UISegmentedControl的详细使用
  • 原文地址:https://www.cnblogs.com/zyz010206/p/12329634.html
Copyright © 2020-2023  润新知