高精度模板

来源:互联网 发布:js设置div滚动条位置 编辑:程序博客网 时间:2024/05/17 02:32

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
原创粉丝点击