关于长整数类的实现,该如何处理
关于长整数类的实现
我定义了一个长整数类longint(任意位数的),其中有重载运算符+、-、*、/、=等,现在我想实现longint a=111221335696543436545463234313,注意:初始化的数是任意长的,而我的构造函数是用字符串来初始化长整数的。怎么实现??还有定义了longint a、b、c三个对象。c=a+b这样表示可以,能不能c=a+124634134343134642任意数?
------解决方案--------------------
我定义了一个长整数类longint(任意位数的),其中有重载运算符+、-、*、/、=等,现在我想实现longint a=111221335696543436545463234313,注意:初始化的数是任意长的,而我的构造函数是用字符串来初始化长整数的。怎么实现??还有定义了longint a、b、c三个对象。c=a+b这样表示可以,能不能c=a+124634134343134642任意数?
------解决方案--------------------
- C/C++ code
#include<iostream> #include<cstring> using namespace std; class big { public: big(int *b,int n,int flag) { this->b=b; this->n=n; this->flag=flag; } big(){} ~big(){} int *b;//大数组成的数组 int n;//大数的长度 int flag;//正负标志0是正1是负2是零 bool iszheng() { if(flag==0) return true; if(flag==1) return false; } bool isling() { if(flag==2) return true; return false; } big Add(big b1) { if(flag==2&&b1.flag!=2) { return b1; } if(flag!=2&&b1.flag==2) { return *this; } if(flag==2&&b1.flag==2) { int *x=new int[1]; x[0]=0; return big(x,1,2); } if(flag==1&&b1.flag==0) { big b2=*this; return b1.Abstract(b2); } if(flag==0&&b1.flag==1) { return Abstract(b1); } int i=0,*t,tt=0,kk=0; if(n<b1.n) { t=new int[b1.n+1]; t[b1.n]=0; while(i<n) { tt=b[i]+b1.b[i]+kk; t[i]=tt%10000; kk=tt/10000; i++; } while(i>=n&&i<b1.n) { if(kk!=0) { tt=b1.b[i]+kk; t[i]=tt%10000; kk=tt/10000; i++; } else { t[i]=b1.b[i]; i++; } } if(kk!=0) { t[i]=kk; } /* */ int iii=b1.n+1; for(int ii=b1.n;ii>=0;ii--) { if(t[ii]==0) { iii=iii-1; } if(t[ii]!=0) break; } int *ff=new int[iii]; for(int jj=0;jj<iii;jj++) { ff[jj]=t[jj]; } delete []t; if(flag==1&&b1.flag==1) { big B=big(ff,iii,1); return B; } big B=big(ff,iii,0); return B; } else { t=new int[n+1]; t[n]=0; while(i<b1.n) { tt=b[i]+b1.b[i]+kk; t[i]=tt%10000; kk=tt/10000; i++; } while(i>=b1.n&&i<n) { if(kk!=0) { tt=b[i]+kk; t[i]=tt%10000; kk=tt/10000; i++; } else { t[i]=b[i]; i++; } } if(kk!=0) { t[i]=kk; } int iii=n+1; for(int ii=n;ii>=0;ii--) { if(t[ii]==0) { iii=iii-1; } if(t[ii]!=0) break; } int *ff=new int[iii]; for(int jj=0;jj<iii;jj++) { ff[jj]=t[jj]; } delete []t; if(flag==1&&b1.flag==1) { big B=big(ff,iii,1); return B; } big B=big(ff,iii,0); return B; } } big Abstract(big b1) { if(flag==2&&b1.flag!=2) { b1.flag==0?1:0; return b1; } if(flag!=2&&b1.flag==2) { return *this; } if(flag==2&&b1.flag==2) { int *x=new int[1]; x[0]=0; return big(x,1,2); } if(flag==1&&b1.flag==0) { big b2=*this; b1.flag=1; return b1.Add(b2); } if(flag==0&&b1.flag==1) { b1.flag=0; return Add(b1); } int i=0,*t,tt=0,kk=0; if(n<b1.n) { t=new int[b1.n]; for(int gg=0;gg<b1.n;gg++) t[gg]=0; while(i<n) { if(b1.b[i]>=b[i]) { t[i]=b1.b[i]-b[i]; } else { int j=i+1; while(b1.b[j]==0) { j++; } b1.b[j]=b1.b[j]-1; for(int w=j-1;w>=i+1;w--) b1.b[w]=9999; b1.b[i]=10000+b1.b[i]; t[i]=b1.b[i]-b[i]; } i++; } while(i>=n&&i<b1.n) { t[i]=b1.b[i]; i++; } int iii=b1.n; for(int ii=b1.n-1;ii>=0;ii--) { if(t[ii]==0) { iii=iii-1; } if(t[ii]!=0) break; } int *ff=new int[iii]; for(int jj=0;jj<iii;jj++) { ff[jj]=t[jj]; } delete []t; if(flag==1&&b1.flag==1) { big B=big(ff,iii,0); return B; } big B=big(ff,iii,1); return B; } if(n>b1.n) { t=new int[n]; for(int gg=0;gg<n;gg++) t[gg]=0; while(i<b1.n) { if(b[i]>=b1.b[i]) { t[i]=b[i]-b1.b[i]; } else { int j=i+1; while(b[j]==0) { j++; } b[j]=b[j]-1; for(int w=j-1;w>=i+1;w--) b[w]=9999; b[i]=10000+b[i]; t[i]=b[i]-b1.b[i]; } i++; } while(i>=b1.n&&i<n) { t[i]=b[i]; i++; } int iii=n; for(int ii=n-1;ii>=0;ii--) { if(t[ii]==0) { iii=iii-1; } if(t[ii]!=0) break; } int *ff=new int[iii]; for(int jj=0;jj<iii;jj++) { ff[jj]=t[jj]; } delete []t; if(flag==1&&b1.flag==1) { big B=big(ff,iii,1); return B; } big B=big(ff,iii,0); return B; } if(n==b1.n) { int flag1=2; t=new int[b1.n]; for(int gg=0;gg<b1.n;gg++) t[gg]=0; for(gg=b1.n-1;gg>=0;gg--) { if(b[gg]==b1.b[gg]) continue; if(b[gg]<b1.b[gg]) { flag1=1; break; } if(b[gg]>b1.b[gg]) { flag1=0; break; } } while(i<b1.n) { if(flag1==0) { if(b[i]>=b1.b[i]) { t[i]=b[i]-b1.b[i]; } else { int j=i+1; while(b[j]==0) { j++; } b[j]=b[j]-1; for(int w=j-1;w>=i+1;w--) b[w]=9999; b[i]=10000+b[i]; t[i]=b[i]-b1.b[i]; } } if(flag1==1) { if(b1.b[i]>=b[i]) { t[i]=b1.b[i]-b[i]; } else { int j=i+1; while(b1.b[j]==0) { j++; } b1.b[j]=b1.b[j]-1; for(int w=j-1;w>=i+1;w--) b1.b[w]=9999; b1.b[i]=10000+b1.b[i]; t[i]=b1.b[i]-b[i]; } } if(flag1==2) { int *z=new int[1]; z[0]=0; return big(z,1,2); } i++; } if(flag1==0) { int iii=b1.n; for(int ii=b1.n-1;ii>=0;ii--) { if(t[ii]==0) { iii=iii-1; } if(t[ii]!=0) break; } int *ff=new int[iii]; for(int jj=0;jj<iii;jj++) { ff[jj]=t[jj]; } delete []t; if(flag==1&&b1.flag==1) { big B=big(ff,iii,1); return B; } big B=big(ff,iii,0); return B; } if(flag1==1) { int iii=b1.n; for(int ii=b1.n-1;ii>=0;ii--) { if(t[ii]==0) { iii=iii-1; } if(t[ii]!=0) break; } int *ff=new int[iii]; for(int jj=0;jj<iii;jj++) { ff[jj]=t[jj]; } delete []t; if(flag==1&&b1.flag==1) { big B=big(ff,iii,0); return B; } big B=big(ff,iii,1); return B; } } }