高精度加减乘法

· · 个人记录

#include<bits/stdc++.h>
using namespace std;
void jf(string a,string b){
    int an[1000]={0},bn[1000]={0};
    int lena=a.size(),lenb=b.size();
    int lenmax=max(lena,lenb);
    for(int i=0;i<lena;i++){
        an[i]=a[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;i++){
        bn[i]=b[lenb-i-1]-'0';
    }
    for(int i=0;i<lenmax;i++){
        an[i]+=bn[i];
        if(an[i]>=10){
            an[i]%=10;
            an[i+1]+=1;
        }
    }
    if(an[lenmax]!=0)lenmax++;
    for(int i=lenmax-1;i>=0;i--){
        cout<<an[i];
    }
}
void gao_jing_du_jian_fa(string a,string b){
    int an[1000],bn[1000];
    int lena=a.size(),lenb=b.size();
    int len=max(lena,lenb);
    bool f;
    if(lena==lenb){
        if(a>b)f=0;
        else f=1;
    }
    else{
        if(len==lena)f=0;
        else f=1;
    }
    if(f)swap(a,b);
    for(int i=0;i<lena;i++){
        an[i]=a[lena-i-1]-'0';
    }
    for(int i=0;i<lenb;i++){
        bn[i]=b[lenb-i-1]-'0';
    }
    for(int i=0;i<len;i++){
        an[i]-=bn[i];
        if(an[i]<0){
            an[i]+=10;
            an[i+1]-=1;
        }
    }
    while(an[len-1]==0&&len>1)len--;
    if(f)cout<<"-";
    for(int i=len-1;i>=0;i--)cout<<an[i];
}
void gao_jing_du_cheng_fa(string a1,string b1){
    int a[1000]={0},b[1000]={0},c[1000]={0};
    int lena=a1.size(),lenb=b1.size();
    for(int i=lena-1;i>=0;i--){
        a[i]=a1[lena-1-i]-'0';
    }
    for(int i=lenb-1;i>=0;i--){
        b[i]=b1[lenb-1-i]-'0';
    }
    for(int i=0;i<lena;i++){
        for(int j=0;j<lenb;j++){
            c[i+j]+=a[i]*b[j];
        }
    }
    int len_sum=lena+lenb;
    for(int i=0;i<len_sum;i++){
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    while(c[len_sum-1]>=10){
        c[len_sum]+=c[len_sum-1]/10;
        c[len_sum-1]%=10;
        len_sum++;
    }
    while(c[len_sum-1]==0&&len_sum>1)len_sum--;
    string ans="";
    for(int i=0;i<len_sum;i++){
        ans+=c[i]+'0';
    }
    for(int i=len_sum-1;i>=0;i--){
        cout<<ans[i];
    }
}
int main(){
    string a,b;
    char c;
    cin>>a>>c>>b;
    if(c=='+'){
        jf(a,b);
    }else if(c=='-'){
        gao_jing_du_jian_fa(a,b);
    }else if(c=='*'){
        gao_jing_du_cheng_fa(a,b);
    }
    return 0;
}