高精度运算略解 在struct中重载运算符

高精度

高精度,即高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。

重载运算符

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
今以高精度 a − b a-b ab 为例,展示在struct中重载运算符的方法。

#include<cstdio>
#include<cstdlib>
#include<cstring>

#define reg register

const int MAXN=10010;

struct node{
	bool f;	//是否为负
	char a[MAXN+10];
	node(){	//对结构体进行初始化
		f=0;
		memset(a,0,sizeof(a));
	}
	void read(){	//读入一个非负的node数
		char s[MAXN+10];
		scanf("%s",s+1);
		int l=strlen(s+1);
		for(reg int i=1;i<=l;++i)
			a[i]=s[l-i+1]-'0';
	}
	void print(){	//打印一个node数
		bool tf=0;	//是否没有前缀0
		if(f) printf("-");
		for(reg int i=MAXN;i>=1;--i){
			if(a[i]) tf=1;
			if(tf) printf("%d",a[i]);
		}
		if(!tf) printf("0");
	}
	node&operator+(node&b){	//重载加法+
	/*
		在这个函数中,operator表示重载,b是+号右边的加数,
		this是一个指向自己的node类型的指针,返回用*this
	*/
		for(reg int i=1;i<=MAXN;++i){
			a[i]+=b.a[i];
			if(a[i]>9){
				a[i]-=10;
				++a[i+1];
			}
		}
		return*this;
	}
	//对于a-b,若b>a,则a-b=-(b-a)。
	bool operator>(node&b){
		for(reg int i=MAXN;i>=1;--i)
			if(a[i]!=b.a[i])
				return bool(a[i]>b.a[i]);
		return 0;
	}
	node&operator-(node&b){
		if(b>*this){
			node t=*this;*this=b;b=t;
			f=1;
		}
		for(reg int i=MAXN;i>=1;--i)
			a[i]-=b.a[i];
		for(reg int i=1;i<=MAXN;++i)
			if(a[i]<0){
				a[i]+=10;
				--a[i+1];
			}
		return*this;
	}
	//省事
	node&operator+=(node&e){
		return*this+e;
	}
	node&operator-=(node&e){
		return*this-e;
	}
}a,b;

int main(){
	a.read();b.read();a-=b;
	a.print();
}

题目描述 luoguP1601 \text{luoguP1601} luoguP1601

高精度加法,相当于 a + b a+b a+b Problem,不用考虑负数。

输入格式

分两行输入 a , b ≤ 1 0 500 a,b\leq10^{500} a,b10500

输出格式

输出只有一行,代表 a + b a+b a+b 的值

输入样例

1
1

输出样例

2

Solution 1601 \text{Solution 1601} Solution 1601

考虑用数组 A , B A,B A,B 存储大数 a , b a,b a,b 进行计算。为了实现方便,常使用 struct 结构体存储。代码见文首。

题目描述 luoguP2142 \text{luoguP2142} luoguP2142

高精度减法

输入格式

两个整数 a , b a,b a,b

输出格式:

结果

输入样例

2
1

输出样例

1

数据规模与约定

对于 100 100% 100 的数据,有 0 &lt; a , b ≤ 1 0 10   000 0&lt;a,b\leq10^{10\ 000} 0<a,b1010 000

Solution 2142 \text{Solution 2142} Solution 2142

注意判负即可。计算 a − b   ( a , b ≥ 0 ) a-b\ (a,b\geq0) ab (a,b0) 时,若 b &gt; a b&gt;a b>a,则 a − b = − ( b − a ) a-b=-(b-a) ab=(ba)
代码见文首。

练习

  1. 高精度除法 luoguP1480 \text{luoguP1480} luoguP1480
  2. 高精度开根 luoguP2293 \text{luoguP2293} luoguP2293
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值