高精度加減法模板(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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM