高精模板
SocietyNiu
2018-02-05 21:21:00
# 高精模板
```
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX_WS=200+2;
struct BigNum{
int ws;
int d[MAX_WS];
//构造函数,自动执行,完成初始化
BigNum(){
clear();
}
BigNum(long long num){
clear();
ws=0;
while(num){ //123
d[++ws]=num%10;
num/=10;
}
}
BigNum(const string& s){
clear();
ws=s.length();
for(int i=1; i<=ws; i++)
d[i]=s[ws-i]-'0';
}
void clear(){
memset(d, 0, sizeof(d));
ws=1;
}
BigNum operator + (const BigNum& B){//重新定义BigNum下的“+”
BigNum C;
C.clear();
int i=1, jw=0;
C.ws=max(this->ws, B.ws);
while(i<=C.ws){
C.d[i]=this->d[i]+B.d[i]+jw;
jw=C.d[i]/10;
C.d[i]%=10;
i++;
}
C.d[i]=jw;
if(jw) C.ws++;
return C;
}
BigNum operator += (const BigNum& B){
*this=*this+B;
return *this;
}
BigNum operator - (const BigNum& B){
BigNum C;
C.clear();
int i=1;
C.ws=max(this->ws, B.ws);
while(i<=C.ws){
C.d[i]=C.d[i]+this->d[i]-B.d[i];
if(C.d[i]<0){
C.d[i+1]--;
C.d[i]+=10;
}
i++;
}
while(C.d[C.ws]==0 && C.ws>1) C.ws--;
return C;
}
BigNum operator -= (const BigNum& B){
*this=*this-B;
return *this;
}
BigNum operator * (const BigNum& B){
BigNum C;
C.clear();
C.ws=this->ws+B.ws;
for(int i=1; i<=this->ws; i++){
int jw=0;
for(int j=1; j<=B.ws; j++){
C.d[i+j-1]=C.d[i+j-1]+this->d[i]*B.d[j]+jw;
jw=C.d[i+j-1]/10;
C.d[i+j-1]%=10;
}
C.d[i+B.ws]=jw;
}
while(C.d[C.ws]==0 && C.ws>1) C.ws--;
return C;
}
BigNum operator *= (const BigNum& B){
return *this=*this*B;
}
bool operator >= (const BigNum& B){
if(this->ws < B.ws) return false;
if(this->ws > B.ws) return true;
for(int i=B.ws; i>=1; i--){
if(this->d[i]>B.d[i]) return true;
if(this->d[i]<B.d[i]) return false;
}
return true;
}
bool operator < (const BigNum& B){
return !(*this>=B);
}
BigNum operator / (const BigNum& B){
BigNum C;
C.clear();
if(*this<B) return C;
C.ws=this->ws-B.ws+1; //可能的最大值, 有可能是A.ws-B.ws
BigNum bjs=*this;
for(int i=C.ws; i>=1; i--){
//构造减数
BigNum js=B;
BigNum t(10);
for(int j=i-1; j>=1; j--) js*=t;
//完成构造减数
while(bjs>=js){
bjs-=js;
C.d[i]++;
}
}
if(C.d[C.ws]==0) C.ws--;
return C;
}
BigNum operator % (const BigNum& B){
BigNum D;
D.clear();
D=*this-((*this/B)*B);
return D;
}
friend ostream& operator << (ostream& os, const BigNum& A);
friend istream& operator >> (istream& is, BigNum& A);
};
ostream& operator << (ostream& os, const BigNum& A){
for(int i=A.ws; i>=1; i--) os<<A.d[i];
return os;
}
istream& operator >> (istream& is, BigNum& A){
string s;
is>>s;
A.clear();
A.ws=s.length();
for(int i=1; i<=A.ws; i++) A.d[i]=s[A.ws-i]-'0';
return is;
}
int main(){
BigNum A,B;
cin>>A>>B;
cout<<A+B;
return 0;
}
```
使用这种方法,主函数特别简单易懂。~~但函数麻烦,不建议竞赛使用~~