问题标题: 高精度加减乘除

1
0
已解决
石峻帆
石峻帆
高级守护
高级守护

高精度加法:

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<int>x,y;
vector<int> add(vector<int>x,vector<int>y){
    vector<int>z;
    int t=0;
    for(int i=0;i<x.size()||i<y.size();i++){
        if(i>=x.size())t+=y[i];
        else if(i>=y.size())t+=x[i];
        else t+=x[i]+y[i];
        z.push_back(t%10);
        t/=10;
    }
    if(t)z.push_back(t);
    return z;
}
int main(){
    cin >> a>> b;
    for(int i=a.size()-1;i>=0;i--){
        x.push_back(a[i]-'0');
    }
    for(int i=b.size()-1;i>=0;i--){
        y.push_back(b[i]-'0');
    }
    auto ans=add(x,y);
    for(int i=ans.size()-1;i>=0;i--){
        cout << ans[i];
    }
    return 0;
}

 

高精度加法:

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<int>x;
vector<int>y;
vector<int>sub(vector<int>x,vector<int>y){
    int t=0;
    vector<int>z;
    for(int i=0;i<x.size();i++){
        if(i<y.size())t=x[i]-y[i]-t;
        else t=x[i]-t;
        z.push_back((t+10)%10);
        if(t<0)t=1;
        else t=0;
    }
    while(z.size()>1&&z.back()==0)z.pop_back();
    return z;
}
bool cmp(string a,string b){
    if(a.size()!=b.size())return a.size()>b.size();
    else return a>b;
}
int main(){
    cin >> a>> b;
    if(!cmp(a,b)){
        cout << '-';
        swap(a,b);
    }
    for(int i=a.size()-1;i>=0;i--){
        x.push_back(a[i]-'0');
    }
    for(int i=b.size()-1;i>=0;i--){
        y.push_back(b[i]-'0');
    }
    auto ans=sub(x,y);
    for(int i=ans.size()-1;i>=0;i--){
        cout<<ans[i];
    }
    return 0;
}

 

高精度乘法(此处是一个比long long最大值大的数乘一个比long long最大值小的数):

#include<bits/stdc++.h>
using namespace std;
string a;
int b;
vector<int>x;
vector<int>f(vector<int>x,int b){
    vector<int>y;
    int t=0;
    for(int i=0;i<x.size();i++){
        t+=x[i]*b;
        y.push_back(t%10);
        t/=10;
    }
    if(t)y.push_back(t);
    while(y.size()>1&&y.back()==0)y.pop_back();
    return y;
}
int main(){
    cin >> a>> b;
    for(int i=a.size()-1;i>=0;i--){
        x.push_back(a[i]-'0');
    }
    auto ans=f(x,b);
    for(int i=ans.size()-1;i>=0;i--){
        cout << ans[i]; 
    }
    return 0;
}

 

高精度除法(此处是一个比long long最大值大的数除以一个比long long最大值小的数):

#include<bits/stdc++.h>
using namespace std;
string a;
int b;
vector<int>x;
vector<int>f(vector<int>x,int b){
    int r=0,t=0;
    vector<int>y;
    for(int i=x.size()-1;i>=0;i--){
        t=r*10+x[i];
        r=t%b;
        y.push_back(t/b);
    }
    reverse(y.begin(),y.end());
    while(y.size()>1&&y.back()==0)y.pop_back();
    return y;
}
int main(){
    cin >> a>> b;
    for(int i=a.size()-1;i>=0;i--){
        x.push_back(a[i]-'0');
    }
    auto ans=f(x,b);
    for(int i=ans.size()-1;i>=0;i--){
        cout << ans[i];
    } 
    return 0;
}

石峻帆在2025-04-12 20:48:11追加了内容

第2个是减法


0
已采纳
高驰宇
高驰宇
高级守护
高级守护

我就学过高精度加减乘,没学过除。

0
0
我要回答