📄 long.h
字号:
///////////////////////////下面是由林秋秋做的Long类////////////////////////////
#ifndef LONG
#define LONG
//____________________________________________要用到的头文件
#include<iostream.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
//____________________________________________函数声明部分
inline max(long int x,long int y)
{
return x>y?x:y;
};
char * upsidedown(char * c);
int check(char * a);
int judge(char *x,char *y);
char *multiply(char *x,char *y);
char *add(char *x,char *y);
char *subtract(char *x,char *y);
char *divid(char *x,char *y);
char *labs(char *a);
void subcheck(char *a,int &s,int &index);
//____________________________________________类定义部分
class Long
{
public://______________________________________公有成员
Long(){};
Long(char * a);
Long(long int a);
Long(Long &sour);
~Long();
void input();
void output(ostream & out);
/////////////////////////////
Long & operator =(Long & a);//_______________赋值重载函数声明
Long & operator =(char * a);
Long & operator =(long int a);
Long & operator *=(Long &a);
Long & operator *=(long int a);
Long & operator +=(Long &a);
Long & operator +=(long int a);
Long & operator -=(Long &a);
Long & operator -=(long int a);
Long & operator /=(Long &a);
Long & operator /=(long int a);
Long & operator %=(Long &a);
Long & operator %=(long int a);
Long & operator ++();
Long operator ++(int);
Long & operator --();
Long operator --(int);
Long operator -();
///////////////////////////////////
protected://_____________________________________受保护成员
char *num;
friend Long Labs(Long &a);
friend Long max(Long &x,Long &y);
friend Long min(Long &x,Long &y);
friend Long operator *(Long &x,Long &y);//说明:本来应该使Long 和char*能运算
friend Long operator *(Long &x,long y);//但在大运算时才用到.故等需要是再重载
friend Long operator *(long y,Long &x);
friend Long operator +(Long &x,Long &y);
friend Long operator +(Long &x,long y);
friend Long operator +(long y,Long &x);
friend Long operator -(Long &x,Long &y);
friend Long operator -(Long &x,long y);
friend Long operator -(long y,Long &x);
friend Long operator /(Long &x,Long &y);
friend Long operator /(Long &x,long y);
friend Long operator /(long y,Long &x);
friend Long operator %(Long &x,Long &y);
friend Long operator %(Long &x,long y);
friend Long operator %(long y,Long &x);
friend int operator ==(Long &x,Long &y);
friend int operator ==(Long &x,long int y);
friend int operator ==(long int x,Long &y);
friend int operator !=(Long &x,Long &y);
friend int operator !=(Long &x,long int y);
friend int operator !=(long int x,Long &y);
friend int operator >=(Long &x,Long &y);
friend int operator >=(Long &x,long int y);
friend int operator >=(long int x,Long &y);
friend int operator <=(Long &x,Long &y);
friend int operator <=(Long &x,long int y);
friend int operator <=(long int x,Long &y);
friend int operator >(Long &x,Long &y);
friend int operator >(Long &x,long int y);
friend int operator >(long int x,Long &y);
friend int operator <(Long &x,Long &y);
friend int operator <(Long &x,long int y);
friend int operator <(long int x,Long &y);
friend int operator !(Long &x);
friend int operator ||(Long &x,Long &y);
friend int operator ||(int x,Long &y);
friend int operator ||(Long &x,int y);
friend int operator &&(Long &x,Long &y);
friend int operator &&(int x,Long &y);
friend int operator &&(Long &x,int y);
};
//________________________________________________测试相减时头位数为零的情况
void subcheck(char *a,unsigned int &s,int &index)
{
index=0;
for(int i=s-1;i>=0;i--)
{
if(a[i]!='0')
{
index=i;
break;
}
}
}
//________________________________________________应该有的一般函数
Long Labs(Long &a)//____________________绝对值函数
{
Long temp;
temp.num=labs(a.num);
return temp;
};
Long max(Long &x,Long &y)//_____________最大值函数
{
Long temp;
int k=judge(x.num,y.num);
if(k>0)
{
temp.num=new char[strlen(x.num)+1];
strcpy(temp.num,x.num);
}
else
{
temp.num=new char[strlen(y.num)+1];
strcpy(temp.num,y.num);
}
return temp;
};
Long min(Long &x,Long &y)//_____________最小值函数
{
Long temp;
int k=judge(x.num,y.num);
if(k<0)
{
temp.num=new char[strlen(x.num)+1];
strcpy(temp.num,x.num);
}
else
{
temp.num=new char[strlen(y.num)+1];
strcpy(temp.num,y.num);
}
return temp;
};
//______________________________________________检查字符串是否合格
int check(char *a)
{
int kfh,kjh,kjs=0,kjw=0,kps=0;
for(int i=0;a[i]!='\0';i++)
{
if(a[i+1]=='\0')
kjh=i;
if(a[i]=='-')
{
kjs++;
kjw=i;
kjh=i-1;
}
if(int(a[i])-48<0||int(a[i])-48>9)
kps++;
}
if(kjw==0)
kjw=2*strlen(a);
if(kjs>1||kjw<(i-1)||kps!=kjs||(kjh>=1&&(a[kjh-1]!='0')&&(a[kjh]=='0')))
kfh=0;
else
kfh=1;
return kfh;
}
//_______________________________________________字符数组倒置函数
char * upsidedown(char * c)
{
unsigned int sc=strlen(c);
char *uc=new char[sc+1];
uc[sc]='\0';
for(unsigned int i=0;i<sc;i++)
uc[i]=c[sc-i-1];
return uc;
}
//________________________________________________判断数字大小函数
int judge(char *x,char *y)
{
int kx=0,ky=0;
unsigned int sx=strlen(x),sy=strlen(y);
if(x[sx-1]=='-')
kx=1;
if(y[sy-1]=='-')
ky=1;
if(kx==0&&ky!=0&&(!(sx==1&&sy==2&&x[0]=='0'&&y[0]=='0')))
return 1;
if(kx==0&&ky!=0&&sx==1&&sy==2&&x[0]=='0'&&y[0]=='0')
return 0;
if(ky==0&&kx!=0&&(!(sy==1&&sx==2&&x[0]=='0'&&y[0]=='0')))
return -1;
if(ky==0&&kx!=0&&sy==1&&sx==2&&x[0]=='0'&&y[0]=='0')
return 0;
else
if(sx>sy)
{
if(kx==0)
return 1;
else
return -1;
}
else
if(sx<sy)
{
if(kx==0)
return -1;
else
return 1;
}
else
{
for(int i=sx-kx-1;i>=0;i--)
{
if(x[i]>y[i])
{
if(kx==0)
return 1;
else
return -1;
}
if(x[i]<y[i])
{
if(kx==0)
return -1;
else
return 1;
}
}
}
return 0;
}
//_________________________________________________求数串得绝对值函数
char *labs(char *a)
{
unsigned int sa=strlen(a);
char *absa=new char[sa+1];
strcpy(absa,a);
if(a[sa-1]=='-')
absa[sa-1]='\0';
return absa;
}
//_______________________________________________________________乘法函数
char * multiply(char *x,char *y)
{
if(judge(x,"0")==0||judge(y,"0")==0)
{
char *t=new char[2];
t[0]='0';
t[1]='\0';
return t;
}
int kx=0,ky=0;
unsigned int lim,sx=strlen(x),sy=strlen(y),realx,realy;
if(x[sx-1]=='-')
kx=1;
if(y[sy-1]=='-')
ky=1;
realx=sx-kx;
realy=sy-ky;
if(kx!=0&&ky!=0)
lim=sx+sy-2;
else
lim=sx+sy;
char *mxy=new char[lim+1];
if((kx==0&&ky==0)||(kx!=0&&ky!=0))
lim+=1;
int m1,m2,temp,t,jinwei=0;
for(unsigned int i=0;i<lim-2;i++)
{
if(i<realy)
m1=0;
else
m1=i-realy+1;
if(i<realx)
m2=i;
else
m2=realx-1;
t=0;
for(int j=m1;j<=m2;j++)
t+=(int(x[j])-48)*(int(y[i-j])-48);
temp=t+jinwei;
jinwei=(temp-temp%10)/10;
mxy[i]=char(temp%10+48);
}
if(jinwei!=0)
{
mxy[lim-2]=char(jinwei+48);
if((kx!=0&&ky==0)||(kx==0&&ky!=0))
{
mxy[lim-1]='-';
mxy[lim]='\0';
}
else
mxy[lim-1]='\0';
}
else
{
mxy[lim-1]='\0';
if((kx!=0&&ky==0)||(kx==0&&ky!=0))
{
mxy[lim-2]='-';
mxy[lim]='\0';
}
else
mxy[lim-2]='\0';
}
return mxy;
}
//__________________________________________________________加法函数
char *add(char *x,char *y)
{
int kx=0,ky=0;
unsigned int lim,ms,sx=strlen(x),sy=strlen(y),realx,realy;
if(x[sx-1]=='-')
kx=1;
if(y[sy-1]=='-')
ky=1;
realx=sx-kx;
realy=sy-ky;
ms=max(realx,realy);
if(kx!=0&&ky!=0)
lim=ms+2;
else
lim=ms+1;
char *axy=new char[lim+1];
if((kx!=0&&ky!=0)||(kx==0&&ky==0))
{
int t1,t2,t,jinwei=0;
for(unsigned int i=0;i<ms;i++)
{
if(i<realx)
t1=int(x[i])-48;
else
t1=0;
if(i<realy)
t2=int(y[i])-48;
else
t2=0;
t=t1+t2+jinwei;
if(t>=10)
jinwei=1;
else
jinwei=0;
t=t%10;
axy[i]=char(t+48);
}
if(jinwei!=0)
{
axy[ms]='1';
if(kx==0&&ky==0)
axy[ms+1]='\0';
else
{
axy[ms+1]='-';
axy[ms+2]='\0';
}
}
else
{
axy[ms+1]='\0';
if(kx==0&&ky==0)
axy[ms]='\0';
else
{
axy[ms]='-';
axy[ms+2]='\0';
}
}
}
if(kx==0&&ky!=0)
{
char *yy=labs(y);
int k=judge(x,yy);
if(k>0)
{
int t1,t2,t,tuiwei=0;
for(unsigned int i=0;i<ms;i++)
{
if(i!=sx-1)
t1=int(x[i])-38-tuiwei;
else
t1=int(x[i])-48-tuiwei;
if(i<realy)
t2=int(y[i])-48;
else
t2=0;
t=t1-t2;
if(t>=10)
tuiwei=0;
else
tuiwei=1;
t=t%10;
axy[i]=char(t+48);
}
int index;
subcheck(axy,ms,index);
for(int j=lim;j>index;j--)
axy[j]='\0';
}
if(k<0)
{
int t1,t2,t,tuiwei=0;
for(unsigned int i=0;i<ms;i++)
{
if(i!=realy-1)
t1=int(y[i])-38-tuiwei;
else
t1=int(y[i])-48-tuiwei;
if(i<realx)
t2=int(x[i])-48;
else
t2=0;
t=t1-t2;
if(t>=10)
tuiwei=0;
else
tuiwei=1;
t=t%10;
axy[i]=char(t+48);
}
int index;
subcheck(axy,ms,index);
for(int j=lim;j>index+1;j--)
axy[j]='\0';
axy[index+1]='-';
}
if(k==0)
{
char *axy0=new char[2];
axy0[0]='0';
axy0[1]='\0';
delete []axy;
return axy0;
}
}
if(kx!=0&&ky==0)
axy=add(y,x);
return axy;
}
//________________________________________________________减法函数
char *subtract(char *x,char *y)
{
int kx=0,ky=0;
unsigned sx=strlen(x),sy=strlen(y);
if(x[sx-1]=='-')
kx=1;
if(y[sy-1]=='-')
ky=1;
char *sxy;
char *yy;
if(ky!=0)
{
yy=labs(y);
}
else
{
yy=new char[sy+2];
strcpy(yy,y);
yy[sy]='-';
yy[sy+1]='\0';
}
sxy=add(x,yy);
delete []yy;
return sxy;
}
//___________________________________________________除法函数
char *divid(char *x,char *y)
{
if(judge(y,"0")==0)
{
cout<<"\awrong operation!\n非法操作,分母不能为零!\n";
exit(1);
}
int k,kx=0,ky=0;
unsigned int sdxy,k1,sx=strlen(x),sy=strlen(y),realx,realy;
if(x[sx-1]=='-')
kx=1;
if(y[sy-1]=='-')
ky=1;
realx=sx-kx;
realy=sy-ky;
char *absx=labs(x);
char *absy=labs(y);
k=judge(absx,absy);
char * dxy;
if(k<0)
{
dxy=new char[2];
dxy[0]='0';
dxy[1]='\0';
return dxy;
}
if(k==0)
{
if((kx==0&&ky==0)||(kx!=0&&ky!=0))
{
dxy=new char[2];
dxy[0]='1';
dxy[1]='\0';
return dxy;
}
else
{
dxy=new char[3];
dxy[0]='1';
dxy[1]='-';
dxy[2]='\0';
return dxy;
}
}
else
{
char *test=new char[realy+1];
test[realy]='\0';
for(unsigned int ii=0;ii<realy;ii++)
test[ii]=absx[realx-realy+ii];
if(judge(test,absy)<0)
sdxy=realx-realy;
else
sdxy=realx-realy+1;
if((kx==0&&ky==0)||(kx!=0&&ky!=0))
dxy=new char[sdxy+1];
else
dxy=new char[sdxy+2];
char *temp,*t,*calcu=new char[2];
calcu[1]='\0';
for(unsigned int i=0,kc=0;i<sdxy;i++)
{
for(int j=1;;j++)
{
calcu[0]=char(j+48);
temp=multiply(absy,calcu);
if(judge(test,temp)<0)
break;
delete []temp;
}
t=temp;
temp=subtract(temp,absy);
delete []t;
t=temp;
temp=subtract(test,temp);
delete []t;
delete []test;
if(judge(temp,"0")==0)
k1=0;
else
k1=strlen(temp);
test=new char[k1+2];
test[0]=absx[realx-realy-i-kc-1];
test[k1+1]='\0';
for(unsigned int jj=1;jj<=k1;jj++)
test[jj]=temp[jj-1];
if(i==0&&j==1)
{
--i;
++kc;
continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -