算法【模板】

accbulb / 2024-02-25 / 原文

正好最近和队友决定再过一遍基础,那就用这个博客这个记录一下吧

part one : 高精度部分

791. 高精度加法 - AcWing题库

#include<iostream>
#include<vector>
using namespace std;
const int N=100010;
string a,b;
vector<int> A,B;
vector<int> add(vector<int> &A,vector<int> &B){
    vector<int> C;
    if(A.size()<B.size()) return add(B,A);
    int t=0;
    for(int i=0;i<A.size();i++){
        t+=A[i];
        if(i<B.size()) t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t) C.push_back(1);
    return C;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>a>>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');
    auto C = add(A,B);
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    
    return 0;
}

 792. 高精度减法 - AcWing题库

#include<iostream>
#include<vector>
using namespace std;
string a,b;
vector<int> A,B;
bool cmp(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 A[i]>B[i];
    } 
    return true;
}
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;
    }
    while(C.size()>1 && C.back()==0) C.pop_back();
    return C;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>a>>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(cmp(A,B)){
        auto C = sub(A,B);
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }else{
        auto C = sub(B,A);
        cout<<"-";
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
    
    return 0;
}

 793. 高精度乘法 - AcWing题库

#include<iostream>
#include<vector>
using namespace std;
string a,b;
vector<int> A,B;
vector<int> mul(vector<int> &A,vector<int> &B){
    vector<int> C(A.size()+B.size()+5,0);
    for(int i=0;i<A.size();i++)
        for(int j=0;j<B.size();j++) C[i+j]+=A[i]*B[j];
    int t=0;
    for(int i=0;i<C.size();i++){
        t+=C[i];
        C[i]=t%10;
        t/=10;
    }
    while(C.size()>1 && C.back()==0) C.pop_back();
    return C;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>a>>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');
    auto C = mul(A,B);
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    
    return 0;
}

 794. 高精度除法 - AcWing题库

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
string a;
int b,r=0;
vector<int> A;
vector<int> div(vector<int> &A,int b,int &r){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++){
        r=r*10+A[i];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());
    while(C.size()>1 && C.back()==0) C.pop_back();
    return C;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>a>>b;
    for(int i=0;i<a.size();i++) A.push_back(a[i]-'0');
    auto C = div(A,b,r);
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    cout<<"\n"<<r<<endl;
    
    return 0;
}