|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
- #include<math.h>
- #include<iostream.h>
- #include<stdio.h>
- #include<conio.h>
- #include<vector>
- #define LL_MAX 100
- using namespace std;
- class LLong
- {
- private:
- vector<long> a;
- int m;
- int cp;
- private:
- int LL_BJ(const LLong &B);
- LLong Help_Add(const LLong &B);
- LLong Help_Sub(const LLong &B);
- void LL_Div01(const LLong &B,LLong &Q01,LLong &R01);
- void LL_Div02(const LLong &B,LLong &Q02,LLong &R02);
- void LL_Div03(const LLong &B,LLong &Q03,LLong &R03);
- void LL_Div(const LLong &B,LLong &Q,LLong &R);
- public:
- LLong();
- LLong(char *s);
- LLong(long d);
- ~LLong()
- { ; }
- void print();
- long get_a(int n);
- int get_m();
- int get_cp();
- public:
- LLong operator+(const LLong &B);
- LLong operator-(const LLong &B);
- LLong operator*(const LLong &B);
- LLong operator^(const LLong &B);
- LLong operator%(const LLong &B);
- LLong operator/(const LLong &B);
- int operator==(const LLong &B);
- int operator!=(const LLong &B);
- int operator>(const LLong &B);
- int operator>=(const LLong &B){return(*this>B||*this==B);}
- int operator<(const LLong &B);
- int operator<=(const LLong &B){return(*this<B||*this==B);}
- };
- int main()
- {
- LLong a("8848");
- LLong b("4494");
- a.print();
- cout<<endl;
- b.print();
- cout<<endl;
- (a+b).print();
- cout<<endl;
- ((LLong)8-b).print();
- cout<<endl;
- (a*b).print();
- cout<<endl;
- (a*5).print();
- cout<<endl;
- (a/b).print();
- cout<<endl;
- (a%b).print();
- cout<<endl;
- (a^b).print();
- cout<<endl;
- a.print();
- cout<<endl;
- b.print();
- cout<<endl;
- if(a!=b)
- cout<<"a!=b"<<endl;
- if(a>=b)
- cout<<"a>=b"<<endl;
- if(a<=b)
- cout<<"a<=b"<<endl;
- if(a<b)
- cout<<"a<b"<<endl;
- else if(a==b)
- cout<<"a==b"<<endl;
- else
- cout<<"a>b"<<endl;
- return 0;
- }
- LLong::LLong()
- {
- a.resize(LL_MAX);
- a[0]=0;
- m=0;
- cp=0;
- }
- LLong::LLong(char *s)
- {
- int n,i,t;
- a.resize(LL_MAX);
- if(*s=='-')
- {
- cp=1;
- n=-1;
- }
- else if(*s=='+')
- {
- cp=0;
- n=-1;
- }
- else
- {
- cp=0;
- n=0;
- }
- while(*s!='\0')
- {
- n++;
- s++;
- }
- if(n%4==0)
- {
- n=n/4;
- t=4;
- }
- else
- {
- t=n%4;
- n=n/4+1;
- }
- if(n==0)
- cout<<"Not have dat"<<endl;
- if(n>LL_MAX)
- a.resize(n);
- m=n-1;
- for(i=0;i<n-1;i++)
- a[i]=*(s-1-4*i)-48+(*(s-2-4*i)-48)*10+
- (*(s-3-4*i)-48)*100+(*(s-4-4*i)-48)*1000;
- a[n-1]=0;
- for(i=1;i<=t;i++)
- a[n-1]=a[n-1]+(*(s-i-4*(n-1))-48)*(int)pow(10,i-1);
- }
- LLong::LLong(long d)
- {
- a.resize(LL_MAX);
- if(d<0)
- cp=1;
- else
- cp=0;
- d=abs(d);
- if(d<10000)
- {
- m=0;
- a[0]=d;
- }
- else if(d<100000000)
- {
- m=1;
- a[0]=d%10000;
- d=(d-d%10000)/10000;
- a[1]=d%10000;
- }
- else
- {
- m=2;
- a[0]=d%10000;
- d=(d-d%10000)/10000;
- a[1]=d%10000;
- d=(d-d%10000)/10000;
- a[2]=d%10000;
- }
- }
- void LLong::print()
- {
- long i,b[4];
- char aa[4];
- if(cp==1)
- printf("-");
- printf("%ld",a[m]);
- for(i=m-1;i>=0;i--)
- {
- b[0]=a[i]%10;
- b[1]=((a[i]-b[0])/10)%10;
- b[2]=((a[i]-b[0]-b[1]*10)/100)%10;
- b[3]=((a[i]-b[0]-b[1]*10-b[2]*100)/1000)%10;
- aa[0]=b[0]+48;
- aa[1]=b[1]+48;
- aa[2]=b[2]+48;
- aa[3]=b[3]+48;
- printf("%c%c%c%c",aa[3],aa[2],aa[1],aa[0]);
- }
-
- }
- long LLong::get_a(int n)
- {
- if((n>m)||(n<0))
- {
- cout<<"溢出"<<endl;
- return 0;
- }
- else
- return a[n];
- }
- int LLong::get_cp()
- {
- return cp;
- }
- int LLong::get_m()
- {
- return m;
- }
- int LLong::LL_BJ(const LLong &B)
- {
- int i;
- if(m>B.m)
- return 1;
- else if(m<B.m)
- return -1;
- else
- {
- for(i=m;i>=0;i--)
- {
- if(a[i]>B.a[i])
- return 1;
- else if(a[i]<B.a[i])
- return -1;
- }
- return 0;
- }
- }
- int LLong::operator==(const LLong &B)
- {
- if(cp!=B.cp)
- return 0;
- if(LL_BJ(B)==0)
- return 1;
- else
- return 0;
- }
- int LLong::operator!=(const LLong &B)
- {
- if((LL_BJ(B)==0)&&(cp==B.cp))
- return 0;
- else
- return 1;
- }
- int LLong::operator<(const LLong &B)
- {
- if(cp>B.cp)
- return 1;
- else if(cp<B.cp)
- return 0;
- else
- {
- if(((cp==0)&&(LL_BJ(B)==-1))||((cp==1)&&(LL_BJ(B)==1)))
- return 1;
- else
- return 0;
- }
-
- }
- int LLong::operator>(const LLong &B)
- {
- if(cp>B.cp)
- return 0;
- else if(cp<B.cp)
- return 1;
- else
- {
- if(((cp==0)&&(LL_BJ(B)==1))||((cp==1)&&(LL_BJ(B)==-1)))
- return 1;
- else
- return 0;
- }
- }
- LLong LLong::Help_Add(const LLong &B)
- {
- LLong D;
- int i;
- for(i=0;i<=m;i++)
- {
- if(i<=B.m)
- {
- if(i+2>LL_MAX)D.a.resize(i+2);
- D.a[i+1]=(D.a[i]+a[i]+B.a[i])/10000;
- D.a[i]=(D.a[i]+a[i]+B.a[i])%10000;
- }
- else
- {
- if(i+2>LL_MAX)D.a.resize(i+2);
- D.a[i+1]=(D.a[i]+a[i])/10000;
- D.a[i]=(D.a[i]+a[i])%10000;
- }
- }
- if(D.a[m+1]==0)
- D.m=m;
- else
- D.m=m+1;
- return D;
- }
- LLong LLong::Help_Sub(const LLong &B)
- {
- LLong D;
- int i,y=0;
- for(i=0;i<=m;i++)
- {
- if(i<=B.m)
- {
- if(a[i]-y>=B.a[i])
- {
- if(i+1>LL_MAX)D.a.resize(i+1);
- D.a[i]=a[i]-y-B.a[i];
- y=0;
- }
- else
- {
- if(i+1>LL_MAX)D.a.resize(i+1);
- D.a[i]=10000+a[i]-y-B.a[i];
- y=1;
- }
- }
- else
- {
- if(a[i]-y>=0)
- {
- if(i+1>LL_MAX)D.a.resize(i+1);
- D.a[i]=a[i]-y;
- y=0;
- }
- else
- {
- if(i+1>LL_MAX)D.a.resize(i+1);
- D.a[i]=10000+a[i]-y;
- y=1;
- }
- }
- }
- for(i=m;i>=0;i--)
- if(D.a[i]!=0)
- {
- D.m=i;
- break;
- }
- return D;
- }
- LLong LLong::operator+(const LLong &B)
- {
- LLong D,AA,BB=B;
- if(m+1>LL_MAX)AA.a.resize(m+1);
- for(int i=0;i<=m;i++)
- AA.a[i]=a[i];
- AA.m=m;
- AA.cp=cp;
- if((LL_BJ(BB)==1)||(LL_BJ(BB)==0))
- {
- if(cp==B.cp)
- {
- D=Help_Add(BB);
- D.cp=cp;
- }
- else if((cp==0)&&(B.cp==1))
- {
- D=Help_Sub(BB);
- D.cp=0;
- }
- else
- {
- D=Help_Sub(BB);
- D.cp=1;
- }
- }
- else
- {
- if(BB.m+1>LL_MAX)
- a.resize(BB.m+1);
- cp=BB.cp;m=BB.m;
- for(i=0;i<=BB.m;i++)
- a[i]=BB.a[i];
- BB=AA;
- if(cp==BB.cp)
- {
- D=Help_Add(BB);
- D.cp=cp;
- }
- else if((cp==0)&&(BB.cp==1))
- {
- D=Help_Sub(BB);
- D.cp=0;
- }
- else
- {
- D=Help_Sub(BB);
- D.cp=1;
- }
- }
- if(AA.m+1>LL_MAX)a.resize(AA.m+1);
- cp=AA.cp;
- m=AA.m;
- for(i=0;i<=AA.m;i++)
- a[i]=AA.a[i];
- return D;
- }
- LLong LLong::operator-(const LLong &B)
- {
- LLong D,AA,BB=B;
- if(m+1>LL_MAX)AA.a.resize(m+1);
- for(int i=0;i<=m;i++)
- AA.a[i]=a[i];
- AA.m=m;
- AA.cp=cp;
- if((LL_BJ(BB)==1)||(LL_BJ(BB)==0))
- {
- if(cp==BB.cp)
- {
- D=Help_Sub(BB);
- D.cp=cp;
- }
- else if((cp==0)&&(BB.cp==1))
- {
- D=Help_Add(BB);
- D.cp=0;
- }
- else
- {
- D=Help_Add(BB);
- D.cp=1;
- }
- }
- else
- {
- if(BB.m+1>LL_MAX)
- a.resize(BB.m+1);
- cp=BB.cp;m=BB.m;
- for(i=0;i<=BB.m;i++)
- a[i]=BB.a[i];
- BB=AA;
- if(cp==BB.cp)
- {
- D=Help_Sub(BB);
- if(cp==1)
- D.cp=0;
- if(cp==0)
- D.cp=1;
- }
- else if((cp==0)&&(BB.cp==1))
- {
- D=Help_Add(BB);
- D.cp=1;
- }
- else
- {
- D=Help_Add(BB);
- D.cp=0;
- }
- }
- if(AA.m+1>LL_MAX)a.resize(AA.m+1);
- cp=AA.cp;
- m=AA.m;
- for(i=0;i<=m;i++)
- a[i]=AA.a[i];
- return D;
- }
- LLong LLong::operator*(const LLong &B)
- {
- LLong F,D;
- int i,j,k;
- if(cp==B.cp)
- k=0;
- else
- k=1;
- LLong G=B;
- G.cp=0;
- for(j=0;j<=G.m;j++)
- {
- for(i=0;i<j+m+2;i++)/*sugaigua*/
- {
- if(i+1>LL_MAX)
- D.a.resize(i+1);
- D.a[i]=0;
- }
- D.m=j+m+1;
- for(i=j;i<=j+m;i++)
- {
- D.a[i+1]=(D.a[i]+G.a[j]*a[i-j])/10000;
- D.a[i]=(D.a[i]+G.a[j]*a[i-j])%10000;
- }
- if(D.a[j+m+1]==0)
- D.m=j+m;
- D.cp=0;
- F=F+D;
- }
- F.cp=k;
- return F;
- }
- LLong LLong::operator^(const LLong &B)
- {
- LLong AA,d,W,BB=B,T(1),D(1);
- if(BB<W)
- {
- cout<<"指数不能负"<<endl;
- return 1;
- }
- if(m+1>LL_MAX)AA.a.resize(m+1);
- AA.m=m;
- AA.cp=cp;
- for(int i=0;i<=m;i++)
- AA.a[i]=a[i];
- for(d=W;d<BB;d=d+T)
- {
- D=D*AA;
- }
- return D;
- }
- void LLong::LL_Div01(const LLong &B,LLong &Q,LLong &R)
- {
- int i,n;
- LLong F,W,T(1);
- LLong AA,BB=B;
- if(m+1>LL_MAX)AA.a.resize(m+1);
- AA.m=m;
- AA.cp=cp;
- for(i=0;i<=m;i++)
- AA.a[i]=a[i];
- AA.cp=BB.cp=0;
- if(LL_BJ(BB)==-1)
- {
- R=AA;
- Q=W;
- }
- else if(LL_BJ(BB)==0)
- {
- R=W;
- Q=T;
- }
- else
- {
- n=AA.m-BB.m;
- for(i=0;i<n;i++)
- {
- if(i+1>LL_MAX)
- F.a.resize(i+1);
- F.a[i]=0;
- }
- if(AA.a[AA.m]>=BB.a[BB.m])
- {
- if(n+1>LL_MAX)F.a.resize(n+1);
- F.a[n]=AA.a[AA.m]/BB.a[BB.m];
- F.m=n;
- }
- else
- {
- F.a[n-1]=(AA.a[AA.m]*10000+AA.a[AA.m-1])/BB.a[BB.m];
- F.m=n-1;
- }
- F.cp=0;
- Q=F;
- R=AA-BB*F;
- }
- }
- void LLong::LL_Div02(const LLong &B,LLong &Q,LLong &R)
- {
- LLong W,AA,BB=B;
- if(m+1>LL_MAX)AA.a.resize(m+1);
- AA.m=m;
- AA.cp=cp;
- for(int i=0;i<=m;i++)
- AA.a[i]=a[i];
- BB.cp=0;
- if(cp==0)
- LL_Div01(BB,Q,R);
- else
- {
- LL_Div01(BB,Q,R);
- if(Q!=W)
- Q.cp=1;
- if(R!=W)
- {
- if(R.cp==0)
- R.cp=1;
- else
- R.cp=0;
- }
- }
- if(AA.m+1>LL_MAX)a.resize(AA.m+1);
- cp=AA.cp;
- m=AA.m;
- for(i=0;i<=AA.m;i++)
- a[i]=AA.a[i];
- return;
- }
- void LLong::LL_Div03(const LLong &B,LLong &Q,LLong &R)
- {
- LLong W,AAA,AA,QQ,RR,T(1),BB=B;
- if(m+1>LL_MAX)AA.a.resize(m+1);
- AA.m=m;
- AA.cp=cp;
- for(int i=0;i<=m;i++)
- AA.a[i]=a[i];
- AAA=AA;
- AA.cp=BB.cp=0;
- while(1)
- {
- LL_Div02(BB,QQ,RR);
- if(RR.m+1>LL_MAX)a.resize(RR.m+1);
- cp=RR.cp;
- m=RR.m;
- for(i=0;i<=RR.m;i++)
- a[i]=RR.a[i];
- if(LL_BJ(BB)==-1)
- {
- if(RR.cp==0)
- {
- R=RR;
- Q=Q+QQ;
- }
- else
- {
- R=BB+RR;
- Q=Q+QQ-T;
- }
- if(AAA.m+1>LL_MAX)a.resize(AAA.m+1);
- cp=AAA.cp;
- m=AAA.m;
- for(i=0;i<=AAA.m;i++)
- a[i]=AAA.a[i];
- return;
- }
- if(RR.m+1>LL_MAX)a.resize(RR.m+1);
- cp=RR.cp;
- m=RR.m;
- for(i=0;i<=RR.m;i++)
- a[i]=RR.a[i];
- Q=Q+QQ;
-
- }
- }
- void LLong::LL_Div(const LLong &B,LLong &Q,LLong &R)
- {
- LLong W,AA,BB=B,AAA;
- if(m+1>LL_MAX)AA.a.resize(m+1);
- AA.m=m;
- AA.cp=cp;
- for(int i=0;i<=m;i++)
- AA.a[i]=a[i];
- AAA=AA;
- if(BB==W)
- printf("Not to Div.");
- if((AA.cp==0)&&(BB.cp==0))
- LL_Div03(BB,Q,R);
- else if((AA.cp==1)&&(BB.cp==1))
- {
- cp=0;BB.cp=0;
- LL_Div03(BB,Q,R);
- }
- else if((AA.cp==1)&&(BB.cp==0))
- {
- cp=0;
- LL_Div03(BB,Q,R);
- if(Q!=W)
- Q.cp=1;
- if(R!=W)
- R.cp=1;
- }
- else
- {
- LL_Div03(BB,Q,R);
- if(Q!=W)
- Q.cp=1;
- }
- if(AAA.m+1>LL_MAX)a.resize(AAA.m+1);
- cp=AAA.cp;
- m=AAA.m;
- for(i=0;i<=AAA.m;i++)
- a[i]=AAA.a[i];
- return;
- }
- LLong LLong::operator%(const LLong &B)
- {
- LLong Q,R;
- LL_Div(B,Q,R);
- return R;
- }
-
- LLong LLong::operator/(const LLong &B)
- {
- LLong Q,R;
- LL_Div(B,Q,R);
- return Q;
- }
复制代码
[ 本帖最后由 风花雪月 于 2006-11-29 07:30 编辑 ] |
评分
-
1
查看全部评分
-
|