Large number of high precision operations (templates)

Source: Internet
Author: User

Preface: High precision operation. Refers to the number of participating operations (Addend. Meiosis, Factor ... The range is significantly beyond the range of the standard data type (integer, real) to represent the operation.

Template: Contains large number of subtraction. The multiplication of large number and int number, the template can be expanded continuously.

Code:

/* All Pro measurements are available, but cannot be used for negative numbers, only large numbers can be calculated for positive numbers */const int ten[4]= {1,10,100,1000};const int maxl = 300;struct bignumber{int D[MAXL]    ;    Char S[MAXL];        BigNumber (const char s[]) {int Len=strlen (s);        d[0]= (len-1)/4+1;        int i,j,k;        for (int i=1; i<maxl; i++) d[i]=0;            for (int i=len-1; i>=0; i--) {j= (len-i-1)/4+1;            k= (len-i-1)%4;        d[j]+=ten[k]* (s[i]-' 0 ');    } while (d[0]>1&&d[d[0]]==0) d[0]--;    } bignumber () {*this=bignumber ("0");        } bignumber (int x) {for (int i=0; i<maxl; i++) d[i]=0;        if (!x) d[0]=1;            while (x) {d[++d[0]]=x%10000;        x/=10000;        }} bignumber (Long long x) {for (int i=0; i<maxl; i++) d[i]=0;        if (!x) d[0]=1;            while (x) {d[++d[0]]=x%10000;        x/=10000;        }} void print () {int len=d[0]; printf ("%d",D[d[0]]);            for (int i=len-1; i>=1; i--) {if (d[i]>=1000) printf ("%d", d[i]);            else if (d[i]>=100) printf ("0%d", D[i]);            else if (d[i]>=10) printf ("00%d", D[i]);        else printf ("000%d", D[i]);    } printf ("\ n");        } void ToString () {int top=0;        int i,j,temp;        for (i=3; i>=1; i--) if (d[d[0]]>=ten[i]) break;        Temp=d[d[0]];            for (j=i; j>=0; j--) {s[top++]= (char) (temp/ten[j]+ ' 0 ');        TEMP%=TEN[J];            } for (i=d[0]-1; i>0; i--) {temp=d[i];                for (j=3; j>=0; j--) {s[top++]= (char) (temp/ten[j]+ ' 0 ');            TEMP%=TEN[J]; }}}} Zero=bignumber (), D,temp,mid1[15],a[3005];bool operator < (const bignumber &a,const BigNumber &   b) {if (a.d[0]!=b.d[0]) return a.d[0]<b.d[0]; int i;    for (i=a.d[0]; i>0; i--) if (A.d[i]!=b.d[i]) return a.d[i]<b.d[i]; return false;}    BOOL operator > (const bignumber &a,const bignumber &b) {if (b.d[0]!=a.d[0]) return b.d[0]<a.d[0];    int i;    for (i=b.d[0]; i>0; i--) if (A.d[i]!=b.d[i]) return b.d[i]<a.d[i]; return false;}    BOOL operator = = (Const bignumber &a,const bignumber &b) {int i;    if (A.d[0]!=b.d[0]) return false;    for (I=1; i<=a.d[0]; i++) if (A.d[i]!=b.d[i]) return false; return true;} BOOL operator <= (const bignumber &a,const bignumber &b) {return a<b| | A==b;} BOOL operator >= (const bignumber &a,const bignumber &b) {return a>b| | A==b;}    BigNumber operator + (const bignumber &a,const bignumber &b) {BigNumber C;    C.d[0]=max (A.d[0],b.d[0]);    int i,x=0;        for (I=1; i<=c.d[0]; i++) {x=a.d[i]+b.d[i]+x;        c.d[i]=x%10000;    x/=10000; } WHile (x!=0) {c.d[++c.d[0]]=x%10000;    x/=10000; } return C;}    BigNumber operator-(const bignumber &a,const bignumber &b) {BigNumber C;    C.D[0]=A.D[0];    int i,x=0;        for (I=1; i<=c.d[0]; i++) {x=10000+a.d[i]-b.d[i]+x;        c.d[i]=x%10000;    x=x/10000-1;    } while ((c.d[0]>1) && (c.d[c.d[0]]==0)) c.d[0]--; return c;}    BigNumber operator * (const bignumber &a,const bignumber &b) {BigNumber C;    C.D[0]=A.D[0]+B.D[0];    int i,j,x;        for (I=1; i<=a.d[0]; i++) {x=0;            for (int j=1; j<=b.d[0]; J + +) {x=a.d[i]*b.d[j]+x+c.d[i+j-1];            c.d[i+j-1]=x%10000;        x/=10000;    } c.d[i+b.d[0]]=x;    } while ((c.d[0]>1) && (c.d[c.d[0]]==0))--c.d[0]; return c;} BOOL Smaller (const bignumber &a,const bignumber &b,int Delta) {if (a.d[0]+delta!=b.d[0]) return A.d[0]+de    lta<b.d[0];    int i; for (i=a.d[0]; i>0; i--) if (A.d[i]!=b.d[i+delta]) return a.d[i]<b.d[i+delta]; return true;}    void Minus (BigNumber &a,const bignumber &b,int delta) {int i,x=0;        for (I=1; i<=a.d[0]-delta; i++) {x=10000+a.d[i+delta]-b.d[i]+x;        a.d[i+delta]=x%10000;    x=x/10000-1; } while ((a.d[0]>1) && (a.d[a.d[0]]==0)) a.d[0]--;}    BigNumber operator * (const bignumber &a,const int &k) {BigNumber C;    C.D[0]=A.D[0];    int i,x=0;        for (I=1; i<=a.d[0]; i++) {x=a.d[i]*k+x;        c.d[i]=x%10000;    x/=10000;        } while (x>0) {c.d[++c.d[0]]=x%10000;    x/=10000;    } while ((c.d[0]>1) && (c.d[c.d[0]]==0)) c.d[0]--; return c;}    BigNumber operator/(const bignumber &a,const bignumber &b) {BigNumber C;    D=a;    int i,j,temp;    Mid1[0]=b;    for (int i=1; i<=13; i++) mid1[i]=mid1[i-1]*2;        for (i=a.d[0]-b.d[0]; i>=0; i--) {temp=8192; for (j=13; j>=0;                j--) {if (smaller (mid1[j],d,i)) {minus (d,mid1[j],i);            C.d[i+1]+=temp;        } temp/=2;    }} C.d[0]=max (1,a.d[0]-b.d[0]+1);    while ((c.d[0]>1) && (c.d[c.d[0]]==0)) c.d[0]--; return c;}    BigNumber operator% (const bignumber &a,const bignumber &b) {bignumber c=a/b; return a-b*c;}

Large number of high precision operations (templates)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.