更好的阅读体验请点击
前言
高精运算大家都不陌生,重载运算符也听过。
将高精度和重载运算符加在一起,高精度运算将变得非常简单
什么是重载运算符?
简单来说,重载运算符就是自己定义一种新的运算方式(符号必须是c++中已有的);
然后与系统已有的运算符为媒介进行运算。
怎么重载?
node operator *(node x,node y){
node res;
return res;
}
先给个式子:
A=B+C
其中 node 是 A 的类型,operator 是重载的标志,* 是要重载的符号
代码括号中的 x 是 B 的类型,y 是 C 的类型
通俗一点讲就是:被重载的运算符的左边和右边分别是x和y(类型是node);
运算结果是 res(类型也为node)。
伪代码
返回类型 operator 重载的符号 (重载符号左边的运算类型,重载符号右边的运算类型){
.........(代码)
return 等号左边的类型;
}
高精度加法与乘法内附有压位
一个比较不错的高进度运算模板
但未考虑负数的情况
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#define LL long long
#define B 100000000 //压位
#define MAXN 20018
using namespace std;
struct G{
LL k[MAXN];
}a,b; //a,b为运算数字
char s1[MAXN];
char s2[MAXN];
//输出答案
inline void out(G x){
printf("%lld",x.k[x.k[0]]); //最高位单独输出
for(LL i=x.k[0]-1;i>=1;--i) printf("%08lld",x.k[i]); //其余补零输出
printf("\n");
}
//重载乘号
G operator *(G x,G y){
G res; //返回值
memset(res.k,0,sizeof(res.k)); //局部定义要清零
LL lenx=x.k[0],leny=y.k[0];
LL len=lenx+leny-1; //乘完后的长度,不是最终长度,要进位
for(LL i=1;i<=lenx;++i){ //统一乘法
for(LL j=1;j<=leny;++j){
res.k[i+j-1]+=(x.k[i]*y.k[j]);
}
}
for(LL i=1;i<len;++i){ //统一进位
res.k[i+1]+=res.k[i]/B;
res.k