高精度算法(加、减、乘、除)

高精度算法

1.高精度加法

思路:
高精度加法从个位数往前加,得十进一
https://www.acwing.com/problem/content/793/

#include<iostream>
#include<vector>
using namespace std;
//C=A+B;
vector<int> add(vector<int>&A,vector<int>&B){
    
    
    vector<int> C;
    int t=0;
    int i = 0,j = 0;
    while(i<A.size()){
    
    
    //因为a.size()>=b.size();
        t += A[i++];
        //判断B[j]是否存在
        if(j<B.size()) t+=B[j++];
        //把个位数加入
        C.push_back(t%10);
        //两位数留下十位数
        t/=10;
    }
    //判断是否需要进位
    //因为加法最大进位是1
    if(t>0) C.push_back(t);
    return C;
}
int main(){
    
    
    string a,b;
    cin>>a>>b;
    ///使 a>=b
    if(a.size()<b.size()) swap(a,b);
    vector<int> 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;
}

2.高精度减法
https://www.acwing.com/problem/content/794/

思路:
从个位数往前减,不够向前借1

#include<iostream>
#include<vector>
using namespace std;
//C=A-B;
vector<int> sub(vector<int>&A,vector<int>&B){
    
    
    vector<int>C;
    int t=0,i=0,j=0;
    //A>=B
    while(i<A.size()){
    
    
        t+=A[i++];
        if(j<B.size()) t-=B[j++];
        //防止t<0
        C.push_back((t+10)%10);
        //t<0意味着向前借了1,下一个数需要减1
        if(t<0) t=-1;
        else t=0;
    }
    //111999-111888 = 000111
    //把多余的0去掉
    while(C.size()>1){
    
    
        if(C.back()==0) C.pop_back();
        else break;
    }
    return C;
}
int main(){
    
    
    string a,b;
    cin>>a>>b;
    if(a.size()<b.size()||a.size()==b.size()&&a<b){
    
    
        cout<<"-";
        swap(a,b);
    }
    vector<int>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 = sub(A,B);
    for(int i=C.size()-1;i>=0;--i) cout<<C[i];
    return 0;
    
}

3.高精度乘法
https://www.acwing.com/problem/content/795/

思路:
从个位数乘b,把t的个位数加入C中

#include<iostream>
#include<vector>
using namespace std;
//C=A*B
vector<int> mul(vector<int>&A,int B){
    
    
    vector<int>C;
    if(B==0) {
    
    
    //特判  B出现0的情况
        C.push_back(0);
        return C;
    }
    int t,i;
    for(i=t=0;i<A.size();i++){
    
    
        t+=A[i]*B;
        C.push_back(t%10);
        t/=10;
    }
    //把t剩余的放入C中
    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;
}

4.高精度除法
https://www.acwing.com/problem/content/796/

求商和余数
思路:
被除数<除数 被除数往后移一位
不够添0

#include<iostream>
#include<vector>
using namespace std;
vector<int> div(vector<int>&A,int B){
    
    
    vector<int>C;
    int t =0;
    for(int i=0;i<A.size();++i){
    
    
        t=t*10+A[i];
        if(t>=B) C.push_back(t/B);
        //如果计算过程中商为不为0
        else if(C.size()!=0) C.push_back(0);
        //余数
        t-=(t/B)*B;
    }
    //出现商为0的情况
    if(C.size()==0) C.push_back(0);
    C.push_back(t);
    return C;
}
int main(){
    
    
    string a;
    int b;
    cin>>a>>b;
    vector<int>A;
    for(int i=0;i<a.size();++i) A.push_back(a[i]-'0');
    auto C = div(A,b);
    for(int i=0;i<C.size()-1;++i) cout<<C[i];
    cout<<endl;
    cout<<C.back();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44922497/article/details/113871630
今日推荐