算法基礎——高精度加、減、乘、除

1. 思想

大整數——將數字從個位開始存儲

高精度乘法:

在這裏插入圖片描述

高精度除法:

在這裏插入圖片描述

2. 模板

  • 高精度加法
#include<iostream>
#include<vector>

using namespace std;

vector<int> add(vector<int>& v1, vector<int>& v2)
{
    vector<int> v3;
    int carry = 0;
    for(int i=0; i<v1.size()||i<v2.size(); i++)
    {
        if(i < v1.size())   carry += v1[i];
        if(i < v2.size())   carry += v2[i];
        
        v3.push_back(carry%10);
        carry /= 10;
    }
    
    if(carry > 0)   v3.push_back(1);
    return v3;
}

int main()
{
    string a, b;
    cin>>a>>b;
    
    vector<int> v1, v2;
    for(int i=a.size()-1; i>=0; i--)    v1.push_back(a[i] - '0');
    for(int i=b.size()-1; i>=0; i--)    v2.push_back(b[i] - '0');
    
    auto v3 = add(v1, v2);
    
    for(int i=v3.size()-1; i>=0; i--)   cout<<v3[i];
    
    return 0;
}

代碼的驗證

  • 高精度減法
#include<iostream>
#include<vector>

using namespace std;

bool cmp(vector<int>& v1, vector<int>& v2)
{
    if(v1.size() != v2.size())  return v1.size() > v2.size();
    
    for(int i=v1.size()-1; i>=0; i--)
        if(v1[i] != v2[i])
            return v1[i] > v2[i];
            
    return true;
}

vector<int> sub(vector<int>& v1, vector<int>& v2)
{
    vector<int> v3;
    for(int i=0, borrow=0; i<v1.size(); i++)
    {
        borrow = v1[i] - borrow;
        if(i < v2.size())   borrow -= v2[i];
        
        v3.push_back((borrow+10)%10);
        if(borrow < 0)  borrow = 1;
        else    borrow = 0;
    }
    
    while(v3.size() > 1 && v3.back() == 0)  v3.pop_back();
    return v3;
}

int main()
{
    string a, b;
    cin>>a>>b;
    
    vector<int> v1, v2;
    for(int i=a.size()-1; i>=0; i--)    v1.push_back(a[i] - '0');
    for(int i=b.size()-1; i>=0; i--)    v2.push_back(b[i] - '0');
    
    if(cmp(v1, v2))
    {
        auto v3 = sub(v1, v2);
        for(int i=v3.size()-1; i>=0; i--)   cout<<v3[i];
    }else{
        cout<<"-";
        auto v3 = sub(v2, v1);
        for(int i=v3.size()-1; i>=0; i--)   cout<<v3[i];
    }
    
    
    return 0;
}

代碼的驗證

  • 高精度乘法
#include <iostream>
#include <vector>

using namespace std;

vector<int> mul(vector<int>& a, int b)
{
    vector<int> c;
    int t = 0;          //進位
    for(int i=0; i<a.size(); i++)
    {
        t = a[i]*b+t;
        c.push_back(t%10);
        t /= 10;
    }
    
    while(t)
    {
        c.push_back(t%10);
        t /= 10;
    }
    
    return c;
}

int main()
{
    string A;
    int B;
    cin>>A>>B;
    
    vector<int> a;
    for(int i=A.size()-1; i>=0; i--)    a.push_back(A[i]-'0');
    
    auto C = mul(a, B);
    
    for(int i=C.size()-1; i>=0; i--)    cout<<C[i];
    return 0;
}

代碼的驗證

  • 高精度除法
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> div(vector<int>& a, int b, int& r)
{
    vector<int> c;
    
    r = 0;
    for(int i=a.size()-1; i>=0; i--)
    {
        r = r*10+a[i];
        c.push_back(r/b);
        r = r%b;
    }
    
    reverse(c.begin(), c.end());
    
    while(c.size() > 1 && c.back() == 0)    c.pop_back();
    
    return c;
}

int main()
{
    string A;
    int B;
    cin>>A>>B;
    
    vector<int> a;
    for(int i=A.size()-1; i>=0; i--)    a.push_back(A[i]-'0');
    
    int r;
    auto C = div(a, B, r);
    
    for(int i=C.size()-1; i>=0; i--)    cout<<C[i];
    cout<<endl<<r<<endl;
    
    return 0;
}

代碼的驗證

  • 注:本系列參考:AcWing。。。
發佈了96 篇原創文章 · 獲贊 29 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章