高精度整合-vector写法-C++

Posted iuk11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度整合-vector写法-C++相关的知识,希望对你有一定的参考价值。

高精度加法

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
vector<int> x,y;
vector<int> add(vector<int>& a,vector<int>& b){
    if(a.size()<b.size()) return add(b,a);
    vector<int> c;
    int t=0;
    for(int i=0;i<(int)a.size();i++){
        t+=a[i];
        if(i<(int)b.size()) t+=b[i];
        c.push_back(t%10);
        t/=10;
    }
    if(t) c.push_back(t);
    return c;
}
int main(){
    string xx,yy;
    cin>>xx>>yy;
    reverse(xx.begin(),xx.end());
    reverse(yy.begin(),yy.end());
    for(int i=0;i<xx.size();i++){
        x.push_back(xx[i]-'0');
    }
    for(int i=0;i<yy.size();i++){
        y.push_back(yy[i]-'0');
    }
    x=add(x,y);
    for(int i=x.size()-1;i>=0;i--){
        cout<<x[i];
    }
    return 0;
}

高精度减法

bool cmp(vector<int>& a, vector<int>& b){
    if(a.size()!=b.size()) return a.size()>b.size();
    int i=(int)a.size()-1;
    while(a[i]==b[i]&&i>0) --i;
    return a[i]>b[i];
}
vector<int> add(vector<int>& a,vector<int>& b){
    if(cmp(b,a)){
        flag=1;
        return add(b,a);
    }
    vector<int> c;
    int t=0;
    for(int i=0;i<(int)a.size()||t;i++){
        t+=a[i];
        if(i<(int)b.size()) t-=b[i];
        int p=t;
        if(p<0){
            p+=10;
            t=-1;
        }
        c.push_back(p);
        if(t>=0) t=0;
    }
    if(t) flag=1;
    return c;
}
int main(){
    string xx,yy;
    cin>>xx>>yy;
    reverse(xx.begin(),xx.end());
    reverse(yy.begin(),yy.end());
    for(int i=0;i<xx.size();i++){
        x.push_back(xx[i]-'0');
    }
    for(int i=0;i<yy.size();i++){
        y.push_back(yy[i]-'0');
    }
    x=add(x,y);
    if(flag){
        cout<<"-";
    }
    int i=x.size()-1;
    for(;i>=0;i--){
        if(x[i]!=0){
            break;
        }
    }
    if(i==-1) cout<<0;
    for(;i>=0;i--) cout<<x[i];
    return 0;
}

高精度乘法

#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int>& a,int b){
    vector<int> c;
    long long t=0;
    for(int i=0;i<(int)a.size()||t;i++){
        if(i<(int)a.size()) t+=1LL*a[i]*b;
        c.push_back(t%10);
        t/=10;
    }
    return c;
}
int main(){
    string xx;
    int y;
    cin>>xx>>y;
    vector<int> x;
    for(int i=xx.size()-1;i>=0;i--){
        x.push_back(xx[i]-'0');
    }
    x=mul(x,y);
    int i=x.size()-1;
    for(;i>=0;i--){
        if(x[i]!=0) break;
    }
    if(i==-1) cout<<0;
    for(;i>=0;i--) cout<<x[i];
    return 0;
}

高精度除法

#include<bits/stdc++.h>
using namespace std;
vector<int> divv(vector<int>& a,int b,int& r){
    vector<int> c;
    long long t=0;
    for(int i=0;i<(int)a.size();i++){
        t=t*10+a[i];
        if(t/b>0) c.push_back(t/b);
        else c.push_back(0);
        t%=b;
        r=t;
    }
    return c;
}
int main(){
    string xx;
    int y,r;
    cin>>xx>>y;
    vector<int> x;
    for(int i=0;i<xx.size();i++){
        x.push_back(xx[i]-'0');
    }
    x=divv(x,y,r);
    int i=0;
    for(;i<x.size();i++){
        if(x[i]!=0) break;
    }
    if(i==x.size()) cout<<0;
    for(;i<x.size();i++) cout<<x[i];
    cout<<endl<<r;
    return 0;
}

以上是关于高精度整合-vector写法-C++的主要内容,如果未能解决你的问题,请参考以下文章

ACwing(基础)--- 高精度

高精度模版

[转]c++ vector 遍历方式

A. Olesya and Rodion 1000 / 数学 思维

[ACW]791~794高精度

求助 c语言实现高精度乘法