高精度
高精度,即高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。
重载运算符
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
今以高精度
a
−
b
a-b
a−b 为例,展示在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,b≤10500
输出格式
输出只有一行,代表 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 < a , b ≤ 1 0 10 000 0<a,b\leq10^{10\ 000} 0<a,b≤1010 000
Solution 2142 \text{Solution 2142} Solution 2142
注意判负即可。计算
a
−
b
(
a
,
b
≥
0
)
a-b\ (a,b\geq0)
a−b (a,b≥0) 时,若
b
>
a
b>a
b>a,则
a
−
b
=
−
(
b
−
a
)
a-b=-(b-a)
a−b=−(b−a)。
代码见文首。