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)