高精度模板

2016-9-28


由于某些不可抗力,2016-9-25的代码是废的(有很多地方写错了)
于是我又写了一个新的.

#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
class bigint {

    int sz;
    int len,num[1000];


    public:
        bigint() {
            sz=10000;
            memset(num,0,sizeof(num));
            len=0;
        }
        long long operator = (const long long &tmp) {
            long long val;
            val=tmp;
            len=0;
            memset(num,0,sizeof(num));
            while (val) {
                num[len]=val%sz;
                len++;
                val/=sz;
            }
            return tmp;
        }

        template <class T1,class T2> friend bigint operator + (const T1 &A,const T2 &B);
        template <class T> friend bigint operator += (bigint &A,const T &B);
        template <class T1,class T2> friend bigint operator * (const T1 &A,const T2 &B);
        template <class T> friend bigint operator *= (bigint &A,const T &B);
        template <class T1,class T2> friend bool operator < (const T1 &A,const T2 &B);
        template <class T1,class T2> friend bool operator > (const T1 &A,const T2 &B);
        template <class T1,class T2> friend bool operator <= (const T1 &A,const T2 &B);
        template <class T1,class T2> friend bool operator >= (const T1 &A,const T2 &B);
        template <class T1,class T2> friend bool operator == (const T1 &A,const T2 &B);
        template <class T1,class T2> friend bool operator != (const T1 &A,const T2 &B);
        friend istream &operator >> (istream &in,bigint &tmp);
        friend ostream &operator << (ostream &out,const bigint &tmp);
};

template <class T1,class T2> bigint operator + (const T1 &t1,const T2 &t2) {
    bigint A,B;
    A=t1,B=t2;
    bigint ans;
    ans.len=max(A.len,B.len);
    for(int i=0;i<ans.len;i++){
        ans.num[i]+=A.num[i]+B.num[i];
        if(ans.num[i]>=ans.sz){
            ans.num[i]-=ans.sz;
            ans.num[i+1]++;
        }
    }
    if(ans.num[ans.len]>0)ans.len++;
    return ans;
}

template <class T> bigint operator += (bigint &A,const T &B) {
    A=A+B;
    return A;
}

template <class T1,class T2> bigint operator * (const T1 &t1,const T2 &t2) {
    bigint A,B;
    A=t1,B=t2;
    bigint ans;
    for(int i=0;i<A.len;i++){
        for(int j=0;j<B.len;j++){
            ans.num[i+j]+=A.num[i]*B.num[j];
            ans.num[i+j+1]+=ans.num[i+j]/ans.sz;
            ans.num[i+j]%=ans.sz;
        }
    }
    ans.len=A.len+B.len-1;
    if(ans.num[ans.len]>0)ans.len++;
    while(ans.len>=2&&ans.num[ans.len-1]==0)ans.len--;
    return ans;
}

template <class T> bigint operator *= (bigint &A,const T &B) {
    A=A*B;
    return A;
}

template <class T1,class T2> bool operator < (const T1 &t1,const T2 &t2) {
    bigint A,B;
    A=t1,B=t2;
    if (A.len<B.len) return 1;
    else if (A.len>B.len) return 0;
    for (int i=0;i<A.len;++i) {
        if (A.num[i]<B.num[i]) return 1;
        else if (A.num[i]>B.num[i]) return 0;
    }
    return 0;
}

template <class T1,class T2> bool operator > (const T1 &t1,const T2 &t2) {
    bigint A,B;
    A=t1,B=t2;
    if (A.len<B.len) return 0;
    else if (A.len>B.len) return 1;
    for (int i=0;i<A.len;++i) {
        if (A.num[i]<B.num[i]) return 0;
        else if (A.num[i]>B.num[i]) return 1;
    }
    return 0;
}

template <class T1,class T2> bool operator == (const T1 &t1,const T2 &t2) {
    bigint A,B;
    A=t1,B=t2;
    if (A.len!=B.len) return 0;
    for (int i=0;i<A.len;++i) if (A.num[i]!=B.num[i]) return 0;
    return 1;
}

template <class T1,class T2> bool operator != (const T1 &t1,const T2 &t2) {
    bigint A,B;
    A=t1,B=t2;
    if (A.len!=B.len) return 1;
    for (int i=0;i<A.len;++i) if (A.num[i]!=B.num[i]) return 1;
    return 0;
}

template <class T1,class T2> bool operator <= (const T1 &A,const T2 &B) {
    return A==B||A<B;
}

template <class T1,class T2> bool operator >= (const T1 &A,const T2 &B) {
    return A==B||A>B;
}

istream &operator >> (istream &in,bigint &tmp) {
    string str;
    in>>str;
    int l=str.length();
    tmp.len=0;
    memset(tmp.num,0,sizeof(tmp.num));
    for(int i=l-1;i>=0;i-=4){
        int p=0;
        for(int j=max(0,i-3);j<=i;j++)
            p=p*10+(str[j]^48);
        tmp.num[tmp.len++]=p;
    }
    return in;
}
ostream &operator << (ostream &out,const bigint &tmp) {
    out<<tmp.num[tmp.len-1];
    for (int i=tmp.len-2;i>=0;i--) {
        out<<setfill('0')<<setw(4)<<tmp.num[i];
    }
    return out;
}

2016-9-25

更新了一下,但是符号优先级好像很奇怪

bigintA=100;

就会出问题,但
bigintA;

A=100;

就没事.
(此代码已废)

#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
struct bigint {
    int sz;
    int len,num[1000];
    bigint(int key=10000) {
        sz=key;
        len=0;
        memset(num,0,sizeof(num));
    }
    long long operator = (const long long &tmp) {
        int val;
        val=tmp;
        len=0;
        memset(num,0,sizeof(num));
        while (val) {
            num[len]=val%sz;
            len++;
            val/=sz;
        }
        return tmp;
    }
    friend istream &operator >> (istream &in,bigint &tmp);
    friend ostream &operator << (ostream &out,const bigint &tmp);
};
template <class T> bigint operator + (const bigint &x,const T &t) {
    bigint tmp;
    tmp=t;
    bigint ans;
    ans.len=max(x.len,tmp.len);
    for(int i=0;i<ans.len;i++){
        ans.num[i]+=x.num[i]+tmp.num[i];
        if(ans.num[i]>=ans.sz){
            ans.num[i]-=ans.sz;
            ans.num[i+1]++;
        }
    }
    if(ans.num[ans.len]>0)ans.len++;
    return ans;
}
template <class T> bigint operator + (const T &t,const bigint &x) {
    return x+t;
}
template <class T> bigint operator * (const bigint &x,const T &t) {
    bigint tmp;
    tmp=t;
    bigint ans;
    for(int i=0;i<x.len;i++){
        for(int j=0;j<tmp.len;j++){
            ans.num[i+j]+=x.num[i]*tmp.num[j];
            ans.num[i+j+1]+=ans.num[i+j]/ans.sz;
            ans.num[i+j]%=ans.sz;
        }
    }
    ans.len=x.len+tmp.len-1;
    if(ans.num[ans.len]>0)ans.len++;
    while(ans.len>=2&&ans.num[ans.len-1]==0)ans.len--;
    return ans;
}
template <class T> bigint operator * (const T &t,const bigint &x) {
    return x*t;
}
template <class T> bool operator == (const bigint &x,const T &t) {
    bigint tmp;
    tmp=t;
    if (x.len!=tmp.len) return 0;
    for (int i=0;i<x.len;++i) if (x.num[i]!=tmp.num[i]) return 0;
    return 1;
}
template <class T> bool operator == (const T &t,const bigint &x) {
    return x==t;
}
template <class T> bool operator != (const bigint &x,const T &t) {
    bigint tmp;
    tmp=t;
    if (x.len!=tmp.len) return 1;
    for (int i=0;i<x.len;++i) if (x.num[i]!=tmp.num[i]) return 1;
    return 0;
}
template <class T> bool operator != (const T &t,const bigint &x) {
    return x!=t;
}
template <class T> bool operator < (const bigint &x,const T &t) {
    bigint tmp;
    tmp=t;
    if (x.len<tmp.len) return 1;
    else if (x.len>tmp.len) return 0;
    for (int i=0;i<x.len;++i) {
        if (x.num[i]<tmp.num[i]) return 1;
        else if (x.num[i]>tmp.num[i]) return 0;
    }
    return 0;
}
template <class T> bool operator > (const bigint &x,const T &t) {
    bigint tmp;
    tmp=t;
    if (x.len<tmp.len) return 0;
    else if (x.len>tmp.len) return 1;
    for (int i=0;i<x.len;++i) {
        if (x.num[i]<tmp.num[i]) return 0;
        else if (x.num[i]>tmp.num[i]) return 1;
    }
    return 0;
}
template <class T> bool operator < (const T &t,const bigint &x) {
    return x>t;
}
template <class T> bool operator > (const T &t,const bigint &x) {
    return x<t;
}
istream &operator >> (istream &in,bigint &tmp) {
    string str;
    in>>str;
    int l=str.length();
    tmp.len=0;
    memset(tmp.num,0,sizeof(tmp.num));
    for(int i=l-1;i>=0;i-=4){
        int p=0;
        for(int j=max(0,i-3);j<=i;j++)
            p=p*10+(str[j]^48);
        tmp.num[tmp.len++]=p;
    }
    return in;
}
ostream &operator << (ostream &out,const bigint &tmp) {
    out<<tmp.num[tmp.len-1];
    for (int i=tmp.len-2;i>=0;i--) {
        out<<setfill('0')<<setw(4)<<tmp.num[i];
    }
    return out;
}

2016-7-12

仅仅只是高精度模板 -_-||

struct BigInt {
    int num[100];
    int len;
    BigInt() {
        memset(num,0,sizeof(num));
    }
    void get(int x) {
        memset(num,0,sizeof(num));
        num[0]=x;
        len=1;
    }
    void Rd() {
        char str[400];
        scanf("%s",str);
        int l=strlen(str);
        len=0;
        for(int i=l-1; i>=0; i-=4) {
            int p=0;
            for(int j=max(0,i-3); j<=i; j++)
                p=p*10+(str[j]-'0');
            num[len++]=p;
        }
    }
    void Print() {
        printf("%d",num[len-1]);
        for(int i=len-2; i>=0; i--)
            printf("%04d",num[i]);
        puts("");
    }
    BigInt operator +(const BigInt & tmp)const {
        BigInt C;
        C.len=max(len,tmp.len);
        for(int i=0; i<C.len; i++) {
            C.num[i]+=num[i]+tmp.num[i];
            if(C.num[i]>=10000) {
                C.num[i+1]+=1;
                C.num[i]-=10000;
            }
        }
        if(C.num[C.len]>0)C.len++;
        return C;
    }
    BigInt operator * (const BigInt &tmp)const {
        BigInt C;
        for(int i=0; i<len; i++)
            for(int j=0; j<tmp.len; j++) {
                C.num[i+j]+=num[i]*tmp.num[j];
                if(C.num[i+j]>=10000) {
                    C.num[i+j+1]+=C.num[i+j]/10000;
                    C.num[i+j]%=10000;
                }
            }
        C.len=len+tmp.len-1;
        if(C.num[C.len]>0)C.len++;
        while(C.len>=2&C.num[C.len-1]==0)C.len--;
        return C;
    }
    bool operator < (const BigInt &tmp)const {
        if(len!=tmp.len)return len<tmp.len;
        for(int i=len-1; i>=0; i--) {
            if(num[i]!=tmp.num[i]) {
                return num[i]<tmp.num[i];
            }
        }
    }
};

注意 get() 只能只能赋一个很小的值(赋值语句太麻烦了-_-||)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值