高精度板子

本文详细介绍了如何使用C++实现大数的加减乘除等基本运算,包括重载运算符以适应大数类型,并提供了完整的Bignum结构体实现代码。通过对每一位的处理,实现了大数的精确计算。

是拿来给自己抄的哼
适合所有重载定义符

struct Bignum
{
	int a[MAXN],len;
	Bignum(){memset(a,0,sizeof(a));len=0;}
	friend Bignum operator +(Bignum u1,Bignum u2)
	{
		Bignum ret;int len=max(u1.len,u2.len);
		for(int i=1;i<=len;i++)ret.a[i]=u1.a[i]+u2.a[i];
		for(int i=1;i<len;i++)ret.a[i+1]+=ret.a[i]/10,ret.a[i]%=10;
		while(ret.a[len]>9)
		{
			ret.a[len+1]+=ret.a[len]/10;
			ret.a[len]%=10;len++;
		}
		ret.len=len;return ret;
	}
	friend Bignum operator -(Bignum u1,Bignum u2)
	{
		Bignum ret;int len=u1.len;
		for(int i=1;i<=len;i++)ret.a[i]=u1.a[i]-u2.a[i];
		for(int i=1;i<=len;i++)while(ret.a[i]<0)ret.a[i]+=10,ret.a[i+1]--;
		while(ret.a[len]==0&&len>1)len--;
		ret.len=len;return ret;
	}
	friend Bignum operator *(Bignum u1,Bignum u2)
	{
		Bignum ret;int len=u1.len+u2.len-1;
		for(int i=1;i<=u1.len;i++)
			for(int j=1;j<=u2.len;j++)
				ret.a[i+j-1]+=u1.a[i]*u2.a[j];
		for(int i=1;i<len;i++)ret.a[i+1]+=ret.a[i]/10,ret.a[i]%=10;
		while(ret.a[len]>9)
		{
			ret.a[len+1]+=ret.a[len]/10;
			ret.a[len]%=10;len++;
		}
		ret.len=len;return ret;
	}
	friend Bignum operator /(Bignum u1,int u2)
	{
		Bignum ret;int lst=0;
		for(int i=u1.len;i>=1;i--)
		{
			lst=lst*10+u1.a[i];
			if(lst>=u2)ret.a[i]=lst/u2,ret.len=max(ret.len,i);
			lst%=u2;
		}
		return ret;
	}
	friend bool operator <(Bignum u1,Bignum u2)
	{
		if(u1.len>u2.len)return false;
		if(u1.len<u2.len)return true;
		for(int i=u1.len;i>=1;i--)
		{
			if(u1.a[i]>u2.a[i])return false;
			if(u1.a[i]<u2.a[i])return true;
		}
		return false;
	}
	friend bool operator ==(Bignum u1,Bignum u2)
	{
		if(u1.len!=u2.len)return false;
		for(int i=u1.len;i>=1;i--)if(u1.a[i]!=u2.a[i])return false;
		return true;
	}
	void print(){for(int i=len;i>=1;i--)putchar(a[i]+'0');putchar('\n');}
}A,B;
bool check(Bignum u1,Bignum u2)
{
	if(u1.len<u2.len)return false;
	if(u1.len>u2.len)return true;
	for(int i=u1.len;i>=1;i--)
	{
		if(u1.a[i]>u2.a[i])return true;
		if(u1.a[i]<u2.a[i])return false;
	}
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值