//+= *= -= /= operator前面都有&
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct Wint:vector<int>{
Wint(int n=0){
push_back(n);
check();
}
Wint &check()
{
while(!empty()&&!back()) pop_back();
if(empty()) return *this;
for(int i=1;i<size();i++){
(*this)[i]+=(*this)[i-1]/10;
(*this)[i-1]%=10;
}
while(back()>=10){
push_back(back()/10);
(*this)[size()-2]%=10;
}
return *this;
}
};
bool operator <(const Wint &a,const Wint &b)
{
if(a.size()!=b.size()) return a.size()<b.size();
for(int i=a.size()-1;i>=0;i--)
if(a[i]!=b[i]) return a[i]<b[i];
}
bool operator>=(const Wint &a,const Wint &b)
{
return !(a<b);
}
Wint &operator -=(Wint &a,Wint b)
{
if(a<b) swap(a,b);
for(int i=0;i<b.size();a[i]-=b[i],i++)
if(a[i]<b[i]){
int j=i+1;
while(!a[j]) j++;
while(j>i){
a[j]--;
a[--j]+=10;
}
}
return a.check();
}
Wint operator-(Wint a,Wint b)
{
return a-=b;
}
Wint &operator +=(Wint &a,Wint b)
{
if(a.size()<b.size()) a.resize(b.size());
for(int i=0;i<b.size();i++) a[i]+=b[i];
return a.check();
}
Wint operator + (Wint a,Wint b)
{
return a+=b;
}
Wint operator *(Wint a,Wint b)
{
Wint ans;
ans.assign(a.size()+b.size()-1,0);
for(int i=0;i<a.size();i++)
for(int j=0;j<b.size();j++){
ans[i+j]+=a[i]*b[j];
}
return ans.check();
}
Wint divmod(Wint &a,Wint b)
{
Wint ans;
for(int t=a.size()-b.size();a>=b;t--){
Wint d;
d.assign(t+1,0);
d.back()=1;
Wint c=d*b;
while(a>=c){
ans+=d;
a-=c;
}
}
return ans.check();
}
Wint operator/(Wint a,Wint b)
{
return divmod(a,b);
}
int main()
{
//vec越先进去的是位数 位数高的再vector的后面
string aa,bb;
Wint a,b;
cin>>aa>>bb;
for(int i=aa.size()-1;i>=0;i--) a.push_back(aa[i]-'0');
for(int i=bb.size()-1;i>=0;i--) b.push_back(bb[i]-'0');
Wint ans;
ans=a/b;
ans=a-b;
ans=a+b;
ans=a/b;
for(int i=ans.size()-1;i>=0;i--) printf("%d",ans[i]);
return 0;
}
高精度板子
最新推荐文章于 2022-07-19 23:50:11 发布