高精度加法、减法、乘法

#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
struct asd{
    int ans[maxn],len;
    bool jud;
    asd(){
        memset(ans,0,sizeof(ans));
        len=1;
        jud=0;
    }
    asd operator +(asd &A){
        asd B;
        B.len=max(len,A.len);
        for(int i=0;i<B.len;i++){
            B.ans[i]+=A.ans[i]+ans[i];
            if(B.ans[i]>=10){
                B.ans[i]-=10;
                B.ans[i+1]+=1;
            }
        }
        if(B.ans[B.len]) B.len++;
        return B;
    }
    asd operator -(asd &A) {
        asd B;
        bool jud=0;
        if(A.len>len) jud=1;
        else if(A.len==len){
            for(int i=len-1;i>=0;i--){
                if(A.ans[i]>ans[i]){
                    jud=1;
                    break;
                }
                if(A.ans[i]<ans[i]) break;
            }
        }
        if(jud){
            B.len=A.len;
            for(int i=0;i<B.len;i++){
                if(A.ans[i]>=ans[i]){
                    B.ans[i]=A.ans[i]-ans[i];
                } else {
                    B.ans[i]=A.ans[i]-ans[i]+10;
                    A.ans[i+1]--;
                }
            }
        } else {
            B.len=len;
            for(int i=0;i<B.len;i++){
                if(ans[i]>=A.ans[i]){
                    B.ans[i]=ans[i]-A.ans[i];
                } else {
                    B.ans[i]=ans[i]-A.ans[i]+10;
                    ans[i+1]--;
                }
            }
        }
        B.jud=jud;
        return B;
    }
    asd operator *(asd &A){
        asd B;
        for(int i=0;i<A.len;i++){
            for(int j=0;j<len;j++){
                B.ans[i+j]+=A.ans[i]*ans[j];
            }
        }
        for(int i=0;i<A.len;i++){
            for(int j=0;j<len;j++){
                if(B.ans[i+j]>=10){
                    B.ans[i+j+1]+=B.ans[i+j]/10;
                    B.ans[i+j]%=10;
                }
            }
        }
        B.len=A.len+len;
        return B;
    }
    void read(){
        char s[maxn];
        scanf("%s",s);
        int ll=strlen(s);
        for(int i=0;i<ll;i++) ans[i]=s[ll-i-1]-'0';
        len=ll;
        while(ans[len-1]==0 && len-1!=0) len--;
    }
    void write(){
        while(ans[len-1]==0 && len-1!=0) len--;
        if(jud==1) printf("-");
        for(int i=len-1;i>=0;i--){
            printf("%d",ans[i]);
        }
        printf("\n");
    }
};
asd a,b,c;
int main(){
    a.read();
    b.read();
    c=a*b;//乘法
    c=a+b;//加法
    c=a-b;//减法
    c.write();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/liuchanglc/p/13198203.html
今日推荐