超 短 高精度 bign 模板

终于会了,233

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct bign
{
    int len;
    int num[1501];
    bool flag;
    bign(){len=1;flag=0;memset(num,0,sizeof num);}
    bign(int x)
    {
        if(!x)return;
        len=0;
        while(x)
        {
            num[++len]=x%10;x/=10;
        }
    }
};
bool operator < (bign a,bign b){
    if(a.len<b.len)return 1;
    if(a.len>b.len)return 0;
    for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0;
    return 1;
}
bool operator == (bign a,bign b){
    if(a.len!=b.len)return 0;
    for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
    return 1;
}
bign operator + (bign a,bign b){
    bign ans;
    int i=1,x=0;
    while(i<=a.len || i<=b.len){
        ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
        x=ans.num[i]/10;ans.num[i]%=10;  i++;
    }
    ans.num[i]=x;
    if(!ans.num[i])i--;
    ans.len=i;
    return ans;
}
bign operator * (bign a,bign b){
    bign ans;
    int len=a.len+b.len;
    for(int i=1;i<=a.len;i++){
        int x=0;
        for(int j=1;j<=b.len;j++){
            ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
            x=ans.num[i+j-1]/10;
            ans.num[i+j-1]%=10;
        }
        ans.num[i+b.len]+=x;
    }
    while(!ans.num[len] && len>1)len--;
    ans.len=len;
    return ans;
}
bign operator - (bign a,bign b){
    bign ans;
    if(a==b)return ans;
    if(b<a){
        for(int i=1;i<=a.len;i++){
            if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
            ans.num[i]=a.num[i]-b.num[i];
            if(ans.num[i]<0){
                ans.num[i]+=10; a.num[i+1]--;//向a的高位借位
            }
        }
    }
    else{
        ans.flag=1;// this number(I mean the ans) is smaller than zero
        for(int i=1;i<=b.len;i++){
            if(b.num[i]<0){
                b.num[i]+=10; b.num[i+1]--;
            }
            ans.num[i]=b.num[i]-a.num[i];
            if(ans.num[i]<0){
                ans.num[i]+=10; b.num[i+1]--;
            }
        }
    }
    int len=max(a.len,b.len);
    while(ans.num[len]<=0 && len>1)len--;
    ans.len=len;
    return ans;
}
bign get()
{
    bign ans;
    string s;
    cin>>s;
    int l=s.length();
    ans.len=l;
    if(s[0]=='-')
    {
        ans.flag=1;
        for(int i=1;i<ans.len;i++)ans.num[ans.len-i]=s[i]-48;
    }
    else
    {
        for(int i=0;i<ans.len;i++)ans.num[ans.len-i]=s[i]-48;
    }
    return ans;
}
void out(bign x)
{
    if(x.flag)
    {
        cout<<"-";
        for(int i=x.len-1;i>=1;i--)
        {
            cout<<x.num[i];
        }
    }
    else
    for(int i=x.len;i>=1;i--)
    {
        cout<<x.num[i];
    }
}
int main()
{
    bign x=get();
    out(x);
    return 0;
}

 

posted @ 2014-11-03 19:58  Skyvot  阅读(439)  评论(0编辑  收藏  举报