重载运算符

vivarock

2018-01-04 13:11:53

Personal

```cpp #include<iostream> #include<cstdio> #include<cstring> #define N 2002 using namespace std; struct Bignum{ int len,s[N]; bool f;//1正,0负 Bignum() { len = 1; memset(s,0,sizeof(s)); f = 1; } // = Bignum operator = (const char * num) { len = strlen(num); if(num[0] == '-') { f = 0; for(int i=1;i<len;i++) s[len-i] = s[i] - 48; len--; } else { for(int i=0;i<len;i++) s[len-i] = num[i] - 48; } return * this; } Bignum operator = (const int num) { char a[N]; sprintf(a,"%d",num); * this = a; return * this; } // 初始化 Bignum(const char * num) { * this = num; } Bignum(const int num) { * this = num; } // 逻辑运算符 bool operator < (const Bignum & x) const { if(len != x.len) return len < x.len; for(int i=len;i>0;i--) if(s[i] != x.s[i]) return s[i] < x.s[i]; return false; } bool operator > (const Bignum & x) const {return x < * this;} bool operator <= (const Bignum & x) const {return !(x < * this);} bool operator >= (const Bignum & x) const {return !(* this < x);} bool operator == (const Bignum & x) const {return !(* this < x or x < * this);} bool operator != (const Bignum & x) const {return * this < x or x < * this;} // + and += Bignum operator + (const Bignum & x) { Bignum ans,xx = x; if(f == 1 and xx.f == 0) {//正数加负数等于正数减去正数 f = 1; xx.f = 1; ans = * this - xx; return ans; } if(f == 0 and xx.f == 0) {//负数加负数等于负的两数绝对值之和 f = 1; xx.f = 1; ans = * this + xx; return ans; } if(f == 0 and xx.f == 1) {//负数加正数等于后面的数减去前面的数的绝对值 f = 1; xx.f = 1; ans = xx - * this; return ans; } ans.len = max(len,x.len) + 1; int k = 0; for(int i=1;i<=ans.len;i++) { ans.s[i] = s[i] + x.s[i] + k; k = ans.s[i] / 10; ans.s[i] %= 10; } if(ans.s[ans.len] == 0) ans.len--; return ans; } Bignum operator += (const Bignum & x) { * this = * this + x; return * this; } // - and -= Bignum operator - (const Bignum & x) { Bignum ans,xx = x; ans.len = 1; if(f == 1 and xx.f == 1) {//两个正数的差 if(* this < x) { ans.f = 0; while(ans.len <= len or ans.len <= xx.len) { if(xx.s[ans.len] < s[ans.len]) { xx.s[ans.len] += 10; xx.s[ans.len+1]--; } ans.s[ans.len] = xx.s[ans.len] - s[ans.len]; ans.len++; } } if(* this == x) return ans; if(* this > x) { ans.f = 1; while(ans.len <= len or ans.len <= xx.len) { if(s[ans.len] < xx.s[ans.len]) { s[ans.len] += 10; s[ans.len+1]--; } ans.s[ans.len] = s[ans.len] - xx.s[ans.len]; ans.len++; } } while(ans.len > 0 and ans.s[ans.len] == 0) ans.len--; return ans; } else if(f == 1 and xx.f == 0) {//被减数为正,减数为负,相当于两数绝对值之和 ans.f = 1; xx.f = 1; ans = * this + xx; return ans; } else if(f == 0 and xx.f == 1) {//被减数为负,减数为正,相当于负的两数绝对值之和 ans.f = 0; f = 1; ans = * this + xx; return ans; } else if(f == 0 and xx.f == 0) {//被减数为负,减数为负,相当于负的减数减去被减数 f = 1; xx.f = 1; ans = xx - * this; return ans; } } Bignum operator -= (const Bignum & x) { * this = * this - x; return * this; } // * and *= Bignum operator * (const Bignum & x) { Bignum ans,xx = x; if((f == 1 and xx.f == 1) or (f == 0 and xx.f == 0))//同号为正 ans.f = 1; else ans.f = 0;//异号为负 for(int i=1;i<=len;i++) { int x = 0; for(int j=1;j<=xx.len;j++) { ans.s[i+j-1] += s[i] * xx.s[j] + x; x = ans.s[i+j-1] / 10; ans.s[i+j-1] %= 10; } ans.s[i+xx.len] = x; } ans.len = len + xx.len; while(ans.s[ans.len] == 0 and ans.len > 1) ans.len--; return ans; } Bignum operator *= (const Bignum & x) { * this = * this * x; return * this; } // / and /= Bignum numcpy(Bignum & x,Bignum & y,int det) { for(int i=1;i<=x.len;i++) y.s[det+i-1] = x.s[i]; y.len = x.len + det - 1; } Bignum operator / (const Bignum & x) { Bignum ans,temp,xx = x; if((* this == temp) or (* this < xx))//不够除或是被除数为0,直接返回0 return temp; else { if((f == 1 and xx.f == 1) or (f == 0 and xx.f == 0))//同号为正 ans.f = 1; else ans.f = 0;//异号为负 xx.f = 1;//极为重要,被这个卡了一下午,下面的减法是最简单的减法,所以要把两个数都变成正数 f = 1;//同上 ans.len = len - xx.len + 1; for(int i=ans.len;i>0;i--) { memset(temp.s,0,sizeof(temp.s)); numcpy(xx,temp,i); while(* this >= temp) { * this -= temp; ans.s[i]++; } } while(ans.len > 0 and ans.s[ans.len] == 0) ans.len--; return ans; } } Bignum operator /= (const Bignum & x) { * this = * this / x; return * this; } // over }; ostream & operator << (ostream & out,const Bignum & x) { if(x.f == 0) cout<<"-"; for(int i=x.len;i>0;i--) cout<<x.s[i]; return out; } istream & operator >> (istream & in,Bignum & x) { char num[N]; in>>num; x = num; return in; } int main() { Bignum x,y; cin>>x>>y; x *= y; cout<<x; return 0; } ```