前言
高精度想必大家再熟悉不过了,这里我就不再赘述它的原理(模拟),但大部分同学的高精度用得都太零散了,蒟蒻我就将常用的运算符号用struct封装一下,请大佬们笑纳。
code:
#include<bits/stdc++.h>
using namespace std;
#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;++i)
#define SREP(i,f,t) for(int i=(f),i##_end_=(t);i<i##_end_;++i)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;--i)
#define ll long long
template<class T>inline bool chkmin(T&x,T y){return x>y?x=y,1:0;}
template<class T>inline bool chkmax(T&x,T y){return x<y?x=y,1:0;}
template<class T>inline void rd(T&x){
x=0;char c;
while((c=getchar())<48);
do x=(x<<1)+(x<<3)+(c^48);
while((c=getchar())>47);
}
#define L 1000
#define P 10000
struct Big{
int num[L/4],len;
Big(){
memset(num,0,sizeof(num));
len=1;
}
void Rd(){
char A[L];
scanf("%s",A);
int SL=strlen(A);
len=0;
for(int i=SL-1,x;x=0,i>=0;num[len++]=x,i-=4){
if(i>=3) for(int j=i-3;j<=i;++j) x=(x<<1)+(x<<3)+(A[j]^48);
else for(int j=0;j<=i;++j) x=(x<<1)+(x<<3)+(A[j]^48);
}
}
void Pr(){
if(!num[len-1])putchar('0');
else {
printf("%d",num[len-1]);
DREP(i,len-2,0)printf("%04d",num[i]);
}
}
Big operator+(const Big a)const{
Big b;
b.len=max(len,a.len);
SREP(i,0,b.len){
int &B=b.num[i];
B+=num[i]+a.num[i];
if(B>=P)B-=P,b.num[i+1]++;
}
if(b.num[b.len])b.len++;
return b;
}
Big operator+(int a){
Big b;
b.len=len;
SREP(i,0,b.len){
int &B=b.num[i];
B+=num[i]+a%P;
if(B>=P)B-=P,b.num[i+1]++;
a/=P;
}
if(b.num[b.len])b.len++;
return b;
}
Big operator*(const Big &a)const{
Big b;
b.len=max(len,a.len);
SREP(i,0,len){
SREP(j,0,a.len){
int &B=b.num[i+j];
B+=num[i]*a.num[j];
if(B>=P)b.num[i+j+1]+=B/P,B%=P;
}
}
while(b.num[b.len])b.len++;
return b;
}
Big operator-(const Big &a)const{
Big b;
SREP(i,0,len) b.num[i]=num[i];
b.len=len;
DREP(i,a.len-1,0){
b.num[i]-=a.num[i];
int now=i;
while(b.num[now]<0) b.num[now]+=P,b.num[++now]--;
}
while(b.len>1 and !b.num[b.len-1])b.len--;
return b;
}
bool operator<(const Big &a)const{
if(len!=a.len) return len<a.len;
DREP(i,len-1,0) if(num[i]!=a.num[i]) return num[i]<a.num[i];
return 0;
}
bool operator>(const Big &a)const{
if(len!=a.len) return len>a.len;
DREP(i,len-1,0) if(num[i]!=a.num[i]) return num[i]>a.num[i];
return 0;
}
bool operator==(const Big &a)const{
if(len!=a.len)return 0;
DREP(i,len-1,0) if(num[i]!=a.num[i]) return 0;
return 1;
}
bool operator>=(const Big &a)const{
if(len!=a.len) return len>a.len;
DREP(i,len-1,0) if(num[i]!=a.num[i]) return num[i]>a.num[i];
return 1;
}
bool operator<=(const Big &a)const{
if(len!=a.len) return len<a.len;
DREP(i,len-1,0) if(num[i]!=a.num[i]) return num[i]<a.num[i];
return 1;
}
}a,b,c;
int main(){
a.Rd();
b.Rd();
a.Pr();putchar('\n');
b.Pr();putchar('\n');
// c=a-b;
// c.Pr();
// if(a==b) puts("yes");
// else puts("no");
return 0;
}
小结:
高精度的用处还是很大的吧…