#include<bits/stdc++.h>
using namespace std;
const int N=10000;
struct bign{
int len,x[5010];
bign(){
len=1;
memset(x,0,sizeof(x));
}
};
bign read(string s){
bign a;
int l=s.size();
int c=0,j=0,t=1,q=1;
for(int i=1;i<=l;i++){
c+=(s[l-i]-48)*t;
j++;
t*=10;
if(j==4 || i==l){
a.x[q++]=c;
c=0,j=0;
t=1;
}
}
a.len=l/4+l%4;
return a;
}
void print(bign a){
cout<<a.x[a.len];
for(int i=a.len-1;i>=1;i--){
printf("%04d",a.x[i]);
}
}
bign fix(bign a){
for(int i=1;i<a.len;i++){
while(a.x[i]<0){
a.x[i]+=N;
a.x[i+1]--;
}
a.x[i+1]+=a.x[i]/N;
a.x[i]%=N;
}
while(a.x[a.len]>=N){
a.x[a.len+1]+=a.x[a.len]/N;
a.x[a.len]%=N;
a.len++;
}
while(a.len>1 && a.x[a.len]==0)a.len--;
return a;
}
bign operator + (bign a,int b){
a.x[1]+=b;
return fix(a);
}
bign operator + (bign a,bign b){
bign c;
c.len=max(a.len,b.len)+1;
for(int i=1;i<=c.len;i++)c.x[i]=a.x[i]+b.x[i];
return fix(c);
}
bign operator - (bign a,int b){
a.x[1]-=b;
return fix(a);
}
bign operator - (bign a,bign b){
bign c;
c.len=max(a.len,b.len)+1;
for(int i=1;i<=c.len;i++){
c.x[i]=a.x[i]-b.x[i];
}
return fix(c);
}
bign operator * (bign a,int b){
for(int i=1;i<=a.len;i++)a.x[i]*=b;
return fix(a);
}
bign operator*(bign a,bign b){
bign c;
c.len=a.len+b.len;
for(int i=1;i<=a.len;i++){
for(int j=1;j<=b.len;j++){
c.x[i+j-1]+=a.x[i]*b.x[j];
c.x[i+j]+=c.x[i+j-1]/N;
c.x[i+j-1]%=N;
}
}
return fix(c);
}
bign operator / (bign a,int b){
bign c;
c.len=a.len;
int d=0;
for(int i=a.len;i>=1;i--){
d=d*N+a.x[i];
c.x[i]=d/b;
d%=b;
}
return fix(c);
}
int main(){
string sa,sb;
cin>>sa>>sb;
bign a=read(sa);
bign b=read(sb);
bign c=a-b;
print(c);
return 0;
}
高精度加减乘除模板(压位版)
最新推荐文章于 2024-07-24 20:44:05 发布