高精度模板相关

除法还没写( ̄▽ ̄)

重载写在结构体里,包含 < , != , h+h , h-h (绝对值) 

this指针指本结构体的值 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <set>
#define ll long long
using namespace std;
const int MX=10010;
char s[MX*2];
struct High
{
	int num[MX*2],len;
	void read()
	{
		scanf("%s",&s);
		len=strlen(s);
		for (int i=1;i<=len;i++)
			num[len-i+1]=s[i-1]-'0';
	}
	bool operator <(const High y)
	const
	{
		int yl=y.len;
		if (len!=yl) return len<yl;
		for (int i=len;i>=1;i--)
			if (num[i]!=y.num[i]) return num[i]<y.num[i];
		return false;
	} 
	bool operator !=(const High y)
	const
	{
		if (len!=y.len) return 1;
		for (int i=1;i<=len;i++)
			if (num[i]!=y.num[i]) return 1;
		return 0;
	}
	High operator + (const High y) const
	{
		High z;
		z.len=max(len,y.len)+2;
		for (int i=1;i<=z.len;i++)
		{
			z.num[i]=num[i]+y.num[i];
			z.num[i+1]+=z.num[i]/10;
			z.num[i]%=10;
		}	
		for (;z.num[z.len]==0&&z.len>0;z.len--);
		return z;
	}
	High operator - (const High y) const
	{
		High z;
		if (*this<y) return y-(*this);
		z.len=len;
		for (int i=1;i<=len;i++)
		{
			z.num[i]+=num[i]-y.num[i];
			if (z.num[i]<0) 
				z.num[i]+=10,z.num[i+1]--; 
		}
		for (;z.num[z.len]==0&&z.len>0;z.len--);
		return z;
	}	
	High operator * (const High y) 
	{
		High z;
		z.len=len+y.len+2;
		for (int j=1;j<=y.len;j++)
			for (int i=1;i<=len;i++)
			{
				z.num[i+j-1]+=num[i]*y.num[j];
				z.num[i+j]+=z.num[i+j-1]/10;
				z.num[i+j-1]%=10;
			}
		for (;z.num[z.len]==0&&z.len>0;z.len--);
		return z;	
	}	
	void print()
	{
		if (len==0) printf("0");
		else for (int i=len;i>=1;i--) printf("%d",num[i]);
		printf("\n");
	}
}a,b,c;
int main()
{
	a.read();b.read();
	//c=a+b;
	//c.print();
	//c=a-b;
	//c.print();
	c=a*b;
	c.print();
}

猜你喜欢

转载自blog.csdn.net/wangyc123456/article/details/80205834