⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 long.h

📁 这是一个支持多位数运算(可以达到几百位的长整数)的数类
💻 H
📖 第 1 页 / 共 2 页
字号:
///////////////////////////下面是由林秋秋做的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 + -