高精度模板
#ifndef _CLASS_BIGINTEGER_ #define _CLASS_BIGINTEGER_ #include<string> #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; typedef long long qword; struct Int128 { static const qword maxval=100000000000000000LLU; qword first,second; Int128(qword x,qword y):first(x),second(y){}; Int128(){}; inline void operator += (Int128& pp) { first+=pp.first; second+=pp.second; if (second>=maxval) { first++; second-=maxval; } } inline void operator -=(Int128& pp) { first-=pp.first; second-=pp.second; if (second<0) { second+=maxval; first--; } } }; class BigInteger { public: static const int maxlen=10; static const int maxval=10000; private: int numb[maxlen]; int len; bool sign; void Add(BigInteger &num); void Substract(BigInteger &num); void Multiply(const BigInteger &num); void Divide(const BigInteger &num); int AbsCompare(const BigInteger &num); int Compare(const BigInteger &num); public: BigInteger(); BigInteger(long long x); BigInteger(string str); string ToString()const; void operator =(const BigInteger &num); void operator +=(const BigInteger num); void operator -=(const BigInteger num); void operator *=(const BigInteger num); void operator /=(const BigInteger num); bool operator <(const BigInteger &num); bool operator <=(const BigInteger &num); bool operator >(const BigInteger &num); bool operator >=(const BigInteger &num); friend ostream& operator << (ostream& out,const BigInteger& num); friend istream& operator >> (istream& in,BigInteger& num); friend BigInteger operator +(BigInteger num1,BigInteger num2); friend BigInteger operator -(BigInteger num1,BigInteger num2); friend BigInteger operator *(BigInteger num1,BigInteger num2); }; #endif BigInteger::BigInteger() { memset(numb,0,sizeof(numb)); } BigInteger::BigInteger(long long x) { char s[20]; sprintf(s,"%lld",x); string str=s; *this=BigInteger(str); } BigInteger::BigInteger(string str) { memset(numb,0,sizeof(numb)); sign=false; if (str[0]=='-') { sign=true; str=str.substr(1,str.length()-1); } for (int i=0;i<(int)str.length();i++) { if (!isdigit(str[i]))throw "invalid number!"; numb[(str.length()-i-1)/4]=numb[(str.length()-i-1)/4]*10+str[i]-'0'; } len=(int)(str.length()-1)/4+1; while (len && !numb[len-1])len--; } void BigInteger::Add(BigInteger &num) { if (this->sign!=num.sign) { num.sign^=1; Substract(num); num.sign^=1; }else { len=max(len,num.len); for (int i=0;i<len;i++) numb[i]+=num.numb[i]; for (int i=0;i<len;i++) { numb[i+1]+=numb[i]/maxval; numb[i]%=maxval; } while (numb[len]) { numb[len+1]+=numb[len]/maxval; numb[len]%=maxval; if (len++==maxlen)throw "Out of range!"; } } } void BigInteger::Substract(BigInteger &num) { if (this->sign!=num.sign) { num.sign^=1; Add(num); num.sign^=1; }else { for (int i=0;i<len;i++) numb[i]-=num.numb[i]; for (int i=0;i<len;i++) { if (numb[i]<0) { numb[i]+=maxval; numb[i+1]--; } } if (numb[len]<0)throw "Substract Error!"; while (len && !numb[len-1])len--; } } int BigInteger::AbsCompare(const BigInteger &num) { if (this->len!=num.len) return this->len<num.len?-1:1; for (int i=this->len-1;i>=0;i--) { if (this->numb[i]!=num.numb[i]) return this->numb[i]<num.numb[i]?-1:1; } return 0; } int BigInteger::Compare(const BigInteger &num) { if (this->sign!=num.sign) return this->sign>num.len?-1:1; return AbsCompare(num); } string BigInteger::ToString()const { string res; if (len || numb[0]!=0)res=sign?"-":""; char cstr[5]; sprintf(cstr,"%d",numb[len-1]); res+=cstr; for (int i=len-2;i>=0;i--) { sprintf(cstr,"%04d",numb[i]); res+=cstr; } return res; } void BigInteger::operator =(const BigInteger &num) { memcpy(this,&num,sizeof(num)); } //void BigInteger::operator +=(BigInteger num){} //void BigInteger::operator -=(BigInteger num){} //void BigInteger::operator *=(BigInteger num){} //void BigInteger::operator /=(BigInteger num){} bool BigInteger::operator <(const BigInteger& num) { return this->Compare(num)<0; } bool BigInteger::operator <=(const BigInteger& num) { return this->Compare(num)<=0; } bool BigInteger::operator >(const BigInteger& num) { return this->Compare(num)>0; } bool BigInteger::operator >=(const BigInteger& num) { return this->Compare(num)>0; } ostream& operator << (ostream& out,const BigInteger& num) { string str; str=num.ToString(); out<<str; return out; } istream& operator >> (istream& in,BigInteger& num) { string str; in>>str; num=BigInteger(str); return in; } BigInteger operator + (BigInteger num1,BigInteger num2) { if (num1.AbsCompare(num2)>=0) { num1.Add(num2); return num1; }else { num2.Add(num1); return num2; } } BigInteger operator - (BigInteger num1,BigInteger num2) { if (num1.AbsCompare(num2)>=0) { num1.Substract(num2); return num1; }else { num2.Substract(num1); num2.sign^=1; return num2; } } BigInteger operator * (BigInteger num1,BigInteger num2) { BigInteger ret; ret.sign=num1.sign^num2.sign; ret.len=num1.len+num2.len; for (int i=0;i<num1.len;i++) for (int j=0;j<num2.len;j++) { ret.numb[i+j]+=num1.numb[i]*num2.numb[j]; ret.numb[i+j+1]+=ret.numb[i+j]/BigInteger::maxval; ret.numb[i+j]%=BigInteger::maxval; } for (int i=0;i<ret.len;i++) { ret.numb[i+1]+=ret.numb[i]/BigInteger::maxval; ret.numb[i]%=BigInteger::maxval; } while (ret.numb[ret.len]) { ret.numb[ret.len+1]=ret.numb[ret.len]/BigInteger::maxval; ret.numb[ret.len]%=BigInteger::maxval; ret.len++; } while (ret.len && !ret.numb[ret.len-1])ret.len--; return ret; } int main() { freopen("input.txt","r",stdin); BigInteger a,b,c;; cin>>a>>b; c=a*b; cout<<c<<endl; }
by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载
本博客已停用,新博客地址:http://mhy12345.xyz