C++ 大数类
#include<iostream> #include<cstring> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<cmath> using namespace std; class integer { friend istream& operator>>(istream& is,integer&); friend ostream& operator<<(ostream& os,const integer&);// friend bool operator>(const integer &,const integer&);// friend bool operator<(const integer &,const integer&);// friend bool operator>=(const integer &,const integer&);// friend bool operator<=(const integer &,const integer&);// friend bool operator==(const integer &,const integer&);// friend bool operator!=(const integer &,const integer&);// friend integer operator+(const integer&,const integer&);// friend integer operator-(const integer&,const integer&);// friend integer operator*(const integer&,const integer&);// friend integer operator/(const integer&,const integer&);// friend integer operator%(const integer&,const integer&);// friend integer abs(const integer&);// friend integer operator-(const integer& num);// public: integer& operator=(const integer &);// integer& operator++(); integer operator++(int); integer& operator--(); integer operator--(int); integer& operator+=(const integer&); integer& operator-=(const integer&); integer& operator*=(const integer&); integer& operator/=(const integer&); integer& operator%=(const integer&); integer(const char* s="0");// integer(const long long int& num);// integer(const integer& num);// virtual ~integer();// private: struct _int { public: _int(const char*str="0"); _int(const long long&); _int(const _int&); void show()const; ~_int(); _int(size_t,short); static _int add(const _int&,const _int&); static _int sub(const _int&,const _int&); static _int mul(const _int&,const _int&); static _int div(const _int&,const _int&); static _int mod(const _int&,const _int&); static void intcpy(_int&,const _int&); static bool big(const _int&,const _int&); static bool low(const _int&,const _int&); static bool equ(const _int&,const _int&); short *p; size_t len; }*p; bool sign; }; integer::_int::_int(const char* str):p(0),len(1) { char* t_str=(char*)str; if(strlen(str)==0) { len=1; p=new short[len]; p[0]=0; return; } while(*t_str=='0')t_str++; if(t_str==&str[strlen(str)]&&*(t_str-1)=='0') { len=1; p=new short[len]; p[0]=0; } else { int t_len=strlen(t_str),t_sum=0; len=t_len%4==0?t_len/4:t_len/4+1; int index=0; p=new short[len]; string s(t_str); reverse(s.begin(),s.end()); string::iterator it=s.begin(); for(it=s.begin(); it<s.end()-4; it+=4) { reverse(it,it+4); } reverse(it,s.end()); for(int i=0; i<t_len; ++i) { t_sum=t_sum*10+s.c_str()[i]-'0'; if((i!=0&&(i+1)%4==0)||i==t_len-1) { p[index++]=t_sum; t_sum=0; } } } } integer::_int::_int(const long long& num):p(0),len(1) { int t_len=0; long long temp(num); while(temp>0)temp/=10,t_len++; len=t_len%4==0?t_len/4:t_len/4+1; p=new short [len]; temp=num; for(int i=0; i<(int)len; ++i) { p[i]=temp%10000; temp/=10000; } } integer::_int::_int(const _int&other):p(0),len(1) { this->len=other.len; p=new short [len]; for(size_t i=0; i<len; i++) { p[i]=other.p[i]; } } integer::_int::_int(size_t l,short v):p(0),len(1) { len=l; p=new short[l]; for(int i=0; i<(int)l; i++)p[i]=v; } integer::_int integer::_int:: add(const _int& a,const _int& other) { int max_len,min_len; short *p1=0,*p2=0; if(other.len>=a.len) { p1=a.p,p2=other.p,max_len=other.len,min_len=a.len; } else { p1=other.p,p2=a.p,max_len=a.len,min_len=other.len; } _int sum(max_len+1,0); int t_num=0; for(int i=0; i<max_len; i++) { if(i<min_len)t_num=p1[i]; else t_num=0; sum.p[i]+=t_num+p2[i]; if(sum.p[i]>=10000) { sum.p[i]-=10000; sum.p[i+1]++; } } if(sum.p[max_len]==0)sum.len--; return sum; } integer::_int integer::_int:: sub(const _int& a,const _int& b) { int max_len,min_len; short *p1=0,*p2=0; max_len=a.len,min_len=b.len; p1=a.p,p2=b.p; _int sub(max_len+1,0); int t_num=0; for(int i=0; i<max_len; ++i) { if(i<min_len)t_num=p2[i]; else t_num=0; sub.p[i]+=p1[i]-t_num; if(sub.p[i]<0) { sub.p[i+1]--; sub.p[i]+=10000; } } sub.len--; while(sub.len>1&&sub.p[sub.len-1]==0)sub.len--; return sub; } integer::_int integer::_int:: mul(const _int& a,const _int& other) { _int result(a.len+other.len,0);; for(int i=0; i<(int)result.len; i++) result.p[i]=0; int index=0; for(int i=0; i<(int)a.len; i++) { index=i; for(int j=0; j<(int)other.len; j++) { int mul=a.p[i]*other.p[j]; result.p[index]+=mul%10000; if(result.p[index]>=10000)result.p[index+1]++,result.p[index]-=10000; result.p[++index]+=mul/10000; if(result.p[index]>=10000)result.p[index+1]++,result.p[index]-=10000; } } for(int i=result.len-1; i>0; i--) { if(result.p[i]==0) result.len--; else break; } return result; } integer::_int integer::_int:: div(const _int& a,const _int& b) { vector<_int>v; v.reserve(10000); if(low(a,b))return "0"; _int res("0"); _int zero("0"); v.push_back(_int("1")); _int base(a); _int sub_num; while(!low(base,b)) { intcpy(sub_num,mul(v[v.size()-1],b)); if(!low(base,sub_num)) { ; intcpy(base,sub(base,sub_num)); intcpy((res),add(res,v[v.size()-1])); v.push_back(mul(v[v.size()-1],2)); } else if(equ(v[v.size()-1],"1")) { break; } else v.erase(v.end()-1); } return res; } integer::_int integer::_int:: mod(const _int& a,const _int& b) { vector<_int>v; v.reserve(10000); if(low(a,b))return "0"; _int res("0"); _int zero("0"); v.push_back(_int("1")); _int base(a); _int sub_num; while(!low(base,b)) { intcpy(sub_num,mul(v[v.size()-1],b)); if(!low(base,sub_num)) { ; intcpy(base,sub(base,sub_num)); intcpy((res),add(res,v[v.size()-1])); v.push_back(mul(v[v.size()-1],2)); } else if(equ(v[v.size()-1],"1")) { break; } else v.erase(v.end()-1); } return base; } void integer::_int:: intcpy(_int& dest,const _int&src) { if(&dest!=&src) { delete []dest.p; dest.p=0; dest.p=new short[src.len]; for(int i=0; i<(int)src.len; i++) dest.p[i]=src.p[i]; dest.len=src.len; } } bool integer::_int:: big(const _int& a,const _int& b) { if(a.len>b.len)return true; if(a.len<b.len)return false; for(int i=a.len-1; i>=0; i--) { if(a.p[i]<b.p[i])return false; } if(a.p[0]==b.p[0])return false; return true; } bool integer::_int:: low(const _int& a,const _int& b) { if(a.len<b.len)return true; if(a.len>b.len)return false; for(int i=a.len-1; i>=0; i--) { if(a.p[i]<b.p[i])return true; } if(a.p[0]==b.p[0])return false; return false; } bool integer::_int:: equ(const _int& a,const _int& b) { return (!big(a,b))&&(!low(a,b)); } void integer::_int::show()const { int l=this->len; while(l-1>-0&&0==p[l-1])l--; printf("%d",p[l-1]); for(int i=l-2; i>=0; --i) { printf("%.4d",p[i]); } } integer::_int::~_int() { delete []p; } integer::integer(const char* s):p(0),sign(0) { if(s[0]=='-')p=new _int(s+1),sign=1; else p=new _int(s); } integer::integer(const long long int& n):p(0),sign(0) { if(n<0)p=new _int(-n),sign=1; else p=new _int(n); } integer::integer(const integer& n):p(0),sign(0) { sign=n.sign; p=new _int; integer::_int::intcpy(*p,*n.p); } istream& operator>>(istream& is,integer& num) { string s; is>>s; num=integer(s.c_str()); return is; } ostream& operator<<(ostream& os,const integer&num) { if(abs(num)=="0") { printf("0"); return os; } if(num.sign==1)printf("-"); num.p->show(); return os; } bool operator>(const integer &a,const integer&b) { if(a.sign^b.sign) { if(a.sign)return false; else return true; } else { return integer::_int:: big(*a.p,*b.p); } } bool operator<(const integer &a,const integer&b) { if(a.sign^b.sign) { if(a.sign)return true; else return false; } else { return integer::_int:: low(*a.p,*b.p); } } bool operator>=(const integer &a,const integer&b) { return a>b||a==b; } bool operator<=(const integer &a,const integer&b) { return a<b||a==b; } bool operator==(const integer &a,const integer&b) { return !(a<b||b<a); } bool operator!=(const integer &a,const integer&b) { return !(a==b); } integer operator+(const integer&a,const integer&b) { if(a.sign^b.sign) { if(a.sign) { return abs(b)-abs(a); } else { return abs(a)-abs(b); } } else { integer t; t.sign=a.sign; integer::_int::intcpy(*t.p,integer::_int::add(*a.p,*b.p)); // cout<<t<<endl; return t; } } integer operator-(const integer&a,const integer&b) { if(a.sign^b.sign) { if(a.sign) { integer t=abs(a)+abs(b); t.sign=a.sign; return t; } else { return abs(a)+abs(b); } } else { if(a.sign==1) { return -(abs(a)-abs(b)); } else { integer t; if(abs(a)>=abs(b)) { t.sign=0; integer::_int::intcpy(*t.p,integer::_int::sub(*a.p,*b.p)); } else { t.sign=1; integer::_int::intcpy(*t.p,integer::_int::sub(*b.p,*a.p)); } return t; } } } integer operator*(const integer&a,const integer&b) { integer t; t.sign=a.sign^b.sign; integer::_int::intcpy(*t.p,integer::_int::mul(*a.p,*b.p)); return t; } integer operator/(const integer&a,const integer&b) { integer t; t.sign=a.sign^b.sign; integer::_int::intcpy(*t.p,integer::_int::div(*a.p,*b.p)); return t; } integer operator%(const integer&a,const integer&b) { integer t; t.sign=a.sign^b.sign; integer::_int::intcpy(*t.p,integer::_int::mod(*a.p,*b.p)); return t; } integer abs(const integer & a) { integer t(a); t.sign=0; return t; } integer operator -(const integer&a) { integer t(a); t.sign^=1; if(abs(a)=="0")t.sign=0; return t; } integer& integer::operator =(const integer&a) { if(this!=&a) { sign=a.sign; integer::_int::intcpy(*p,*a.p); } return *this; } integer& integer::operator++() { return *this+=1; } integer integer:: operator++(int) { integer t=*this; *this+=1; return t; } integer& integer::operator--() { return *this-=1; } integer integer::operator--(int) { integer t=*this; *this-=1; return t; } integer& integer::operator+=(const integer&a) { return *this=*this+a; } integer& integer::operator-=(const integer&a) { return *this=*this-a; } integer& integer::operator*=(const integer&a) { return *this=*this*a; } integer& integer::operator/=(const integer&a) { return *this=*this/a; } integer& integer::operator%=(const integer&a) { return *this=*this%a; } integer::~integer() { delete p; } int main() { integer a,b; int cas; scanf("%d",&cas); for(int i=1;i<=cas;i++) { cin>>a>>b; printf("Case %d:\n",i); cout<<a<<" "<<"+"<<" "<<b<<" "<<"="<<" "<<a+b<<endl; if(i!=cas)cout<<endl; } return 0; }