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

📄 eee.h

📁 大数类
💻 H
字号:
#include<iostream.h>

template<class T>
class Array
{
	public:
		Array(int size=0);
		~Array(){delete [] element;}
		int Creat();
		void Print(Array<T>& x);
		int Copy(Array<T>& x);
		void Delete(){delete [] element;}
		void Add(const Array<T>& a,const Array<T>& b,Array<T>& c);
		void Sub1(Array<T>& a,Array<T>& b,Array<T>& c);
		void Sub(Array<T>& a,Array<T>& b,Array<T>& c);
		void CF(Array<T>& a,Array<T>& b,Array<T>& c);
		int Compare(Array<T>& a,Array<T>& b);
		T& operator[](int i) const;
		int Size() const {return size;}
		int length;
	private:
		int size;
		T *element;
};

template<class T>
Array<T>::Array(int sz)
{
//	if(sz<0) throw BadInitializers();
	size=sz;
	element=new T[sz];
}

template<class T>
T& Array<T>::operator[](int i) const
{
//	if(i<0||i>=size) throw OutOfBounds();
	return element[i];
}

template<class T>
int Array<T>::Creat()
{
	for(int i=0;i<=Size();i++)
	{
		if((element[i]=getchar())=='\n')
		{
			length=i-1;
			while(i<Size())
			{
				element[i]=0;
				i++;
			}
			return 0;
		}
		else element[i]=element[i]-48;
	}
}

template<class T>
int Array<T>::Copy(Array<T>& x)
{
	int l=x.length;
	int s=x.Size()-1;
	for(int i=s;i>=0;i--)
	{
		if(l>=0)
		{
			x[i]=x[l];
			if(i!=l)
			{
				x[l]=0;
				l--;
			}
			else l--;
		}
		else return 0;
	}
}

template<class T>
void PutIn(Array<T>& a,Array<T>& b)
{
	a.Creat();
	a.Copy(a);
	b.Creat();
	b.Copy(b);
}

template<class T>
void Print(Array<T>& y)
{
	int i=0;
	for(;i<y.Size();i++)
		if(y[i]!=0) break;
	for(int j=i;j<y.Size();j++)
		cout<<y[j];
	cout<<endl;
}

template<class T>
void Array<T>::Add(const Array<T>& a,const Array<T>& b,Array<T>& c)
{
	int f=a.size-1;
	T u=a.element[f]+b.element[f];
	if(u>=10) c.element[f]=u-10;
	else c.element[f]=u;
	int r=0;
	for(int i=f;i>0;i--)
	{
		T x=a.element[i]+b.element[i]+r;
		if(x>=10) r=1;
		else r=0;
		T y=a.element[i-1]+b.element[i-1]+r;
		if(y>=10) c.element[i-1]=y-10;
		else c.element[i-1]=y;
	}
}

template<class T>
void Array<T>::Sub1(Array<T>& a,Array<T>& b,Array<T>& c)
{
	int f=a.size-1;
	T u=a.element[f]-b.element[f];
	if(u<0) c.element[f]=u+10;
	else c.element[f]=u;
	int r=0;
	for(int i=f;i>=0;i--)
	{
		T x=a.element[i]-b.element[i]-r;
		if(x<0) r=1;
		else r=0;
		T y=a.element[i-1]-b.element[i-1]-r;
		if(y<0) c.element[i-1]=y+10;
		else c.element[i-1]=y;
	}
}

template<class T>
int Array<T>::Compare(Array<T>& a,Array<T>& b)
{
	int s=a.length;
	int t=b.length;
	int m=a.size-a.length-1;
	int q=a.size;
	int j=m;
	if(s==t)
	{
		for(;j<a.size;)
		{
			if(a.element[j]==b.element[j]) {j++;q++;}
			else
			{
				if(j==a.size) break;
				else
					if(a.element[j]>b.element[j]){q=1;break;}
					else {q=-1;break;}			
			}
		}
	}
	else
	{
		if(s<t) q=-2;
		else q=2;
	}
	return q;	
}

template<class T>
void Array<T>::Sub(Array<T>& a,Array<T>& b,Array<T>& c)
{
	int p=a.size+a.length+1;
	int q=c.Compare(a,b);
	if(q==p)
	{
		c.Sub1(a,b,c);
		cout<<0;
	}
	else
	{
		if(q==1||q==2)
		c.Sub1(a,b,c);
		if(q==-1||q==-2)
		{
			Array<T> d(a.size);
			for(int i=0;i<a.size;i++)
			{
				d[i]=a[i];
				a[i]=b[i];
				b[i]=d[i];
			}
			cout<<'-';
			c.Sub1(a,b,c);
		}
	}
}
	///要考虑位数一样且第一个相同的

template<class T>
void Array<T>::CF(Array<T>& a,Array<T>& b,Array<T>& c)
{
	int f=a.size-1;
	Array<T> d(a.size),e(size);
	for(int m=0;m<a.size;m++)
		d.element[m]=0;
	int j=f;
	int q=0;
	do
	{
		T u=a.element[f]*b.element[j];
		if(u>=10) c.element[f]=u%10;
		else c.element[f]=u;
		int r=0;
		for(int i=f;i>0;i--)
		{
			T x=a.element[i]*b.element[j]+r;
			if(x>=10) r=(x-x%10)/10;
			else r=0;
			T y=a.element[i-1]*b.element[j]+r;
			if(y>=10) c.element[i-1]=y%10;
			else c.element[i-1]=y;
		}
		j--;
		Array<T> t(a.size);
		for(int l=0;l<=f;l++)
			t.element[l]=c.element[l];
		if(q!=0)
		{
			for(int z=a.size-q;z<=f;z++)
				c.element[z]=0;
			int v=0;
			for(int h=0;h<a.size-q;h++)
			{
				c.element[h]=t[v+q];
				v++;
			}
		}
		e.Add(c,d,e);
		for(int w=0;w<a.size;w++)
			d.element[w]=e.element[w];
		q++;
	}while(j>=0);
	for(int n=0;n<a.size;n++)
		c.element[n]=e.element[n];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -