1. 程式人生 > >[板子]高精(無符號)

[板子]高精(無符號)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
struct Bignum{
    #define Dignum 1000+5 
    int num[Dignum];
    #undef Dignum
};

Bignum b_trans(char *p){
    int len=strlen(p);
    Bignum ans;
    memset(ans.num,0,sizeof(ans.num));
    ans.num[0]=len;
    for(int i=len-1;i>=0;--i){
        ans.num[len-i]=p[i]-'0';
    }
    return ans;
}

void b_output(Bignum x){
    for(int i=x.num[0];i;--i){
        printf("%c",x.num[i]+'0');
    }
    return;
}

int b_cmp(Bignum a,Bignum b){
    if(a.num[0]>b.num[0]) return 1;
    if(a.num[0]<b.num[0]) return -1;
    for(int i=a.num[0];i;--i){
        if(a.num[i]>b.num[i]) return 1;
        if(a.num[i]<b.num[i]) return -1;
    }
    return 0;
}

Bignum b_add(Bignum a,Bignum b){
    Bignum ans;
    memset(ans.num,0,sizeof(ans.num));
    ans.num[0]=max(a.num[0],b.num[0]);
    int add=0;
    for(int i=1;i<=ans.num[0];++i){
        ans.num[i]+=a.num[i]+b.num[i]+add;
        add=ans.num[i]/10;
        ans.num[i]%=10;
    }
    while(add){
        ++ans.num[0];
        ans.num[ans.num[0]]=add%10;
        add/=10;
    }
    return ans;
}

Bignum b_jian(Bignum a,Bignum b){
    Bignum ans;
    memset(ans.num,0,sizeof(ans.num));
    if(!b_cmp(a,b)){
        ans.num[0]=1;
        ans.num[1]=0;
        return ans;
    }
    ans.num[0]=a.num[0];
    int add=1;
    for(int i=1;i<=ans.num[0];++i){
        ans.num[i]=10+a.num[i]-b.num[i]+add-1;
        add=ans.num[i]/10;
        ans.num[i]%=10;
    }
    while(!ans.num[ans.num[0]]){
        --ans.num[0];
    }
    return ans;
}

Bignum b_mut(Bignum a,Bignum b){
    Bignum ans;
    memset(ans.num,0,sizeof(ans.num));
    for(int i=1;i<=a.num[0];++i){
        for(int j=1;j<=b.num[0];++j){
            ans.num[i+j-1]+=a.num[i]*b.num[j];
        }
    }
    ans.num[0]=a.num[0]+b.num[0]-1;
    int add=0;
    for(int i=1;i<=ans.num[0];++i){
        ans.num[i]+=add;
        add=ans.num[i]/10;
        ans.num[i]%=10;
    }
    while(add){
        ++ans.num[0];
        ans.num[ans.num[0]]=add%10;
        add/=10;
    }
    while(!ans.num[ans.num[0]] && ans.num[0]>1){
        --ans.num[0];
    }
    //if(ans.num[0]==0) ans.num[0]=1;
    return ans;
}

int main(){
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    char a[10000],b[10000];
    scanf("%s",a);
    scanf("%s",b);
    Bignum x=b_trans(a);
    Bignum y=b_trans(b);
    Bignum z=b_mut(x,y);
    b_output(z);
    return 0;
}