今天第三次写长整数加法的题目,不是为了水题。而是为了联系一下运算符重载的语法特性。运用运算符重载之后,感觉代码的可读性更好了,运算符重载的表达功能真的很强。哈哈。贴个AC代码,和大家分享.
这道题目的url:http://acm.hdu.edu.cn/showproblem.php?pid=1002。
#include<iostream> #include<string.h> #include<algorithm> using namespace std; const int Max = 1010; char str[Max]; class BigNum { public: int data[Max]; int len; BigNum() { memset(data, 0, sizeof(data)); } BigNum operator =(char * str) { memset(this->data, 0, sizeof(this->data)); len = strlen(str); for(int i=len-1; i>=0; i--) data[len-i-1] = str[i] - '0'; return *this; } BigNum operator =(int num) { memset(this->data, 0, sizeof(this->data)); int index = 0; while(num) { data[index] = num % 10; num /= 10; index ++; } if(index == 0) index = 1; return *this; } friend BigNum operator +(BigNum &a, BigNum &b) { BigNum r; r = 0; int index = 0, carry = 0; int len = max(a.len, b.len); for(; index<len; index++) { r.data[index] = (a.data[index] + b.data[index] + carry) % 10; carry = (a.data[index] + b.data[index] + carry) / 10; } if(carry) { r.data[index] = carry; index ++; } if(index == 0) index = 1; r.len = index; return r; } friend ostream & operator << (ostream & stream, BigNum &num) { for(int i=num.len-1; i>=0; i--) stream << num.data[i]; return stream; } }; int main() { int cases; BigNum a, b, r; cin >> cases; for(int i=1; i<=cases; i++) { cin >> str; a = str; cin >> str; b = str; r = a + b; cout << "Case " << i << ":" << endl; cout << a << " + " << b << " = " << r << endl; if(i != cases) cout << endl; } system("pause"); return 0; }