天气: 晴朗
心情: 高兴
#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;
}