Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
please help me why WA my code :( ?#include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #define SUM(R, A, B, C) (R = A + B + C, C = R / 10, R %= 10) #define MUL(R, A, B, C) (R = A * B + C, C = R / 10, R %= 10) template<class T, int SIZE = 1020> struct deque { int size, zero; T myArray[SIZE]; deque() { size = 0; zero = 0; } deque(const deque &obj) { size = obj.size; zero = obj.zero; memcpy(myArray, obj.myArray, sizeof(short) * obj.size); } deque &operator =(const deque &obj) { size = obj.size; zero = obj.zero; memcpy(myArray, obj.myArray, sizeof(short) * obj.size); return *this; } void push(const T &value) { myArray[size++] = value; } void pop() { --size; } T &operator [](int index) { return myArray[index]; } const T &operator [](int index) const { return myArray[index]; } }; deque<short> operator +(const deque<short> &left, const deque<short> &right) { int carry, i, j, tmp; deque<short> dq; carry = 0; for (i = 0, j = 0; i < left.size + left.zero && j < right.size + right.zero; ++i, ++j) { SUM(tmp, (i < left.zero ? 0 : left[i - left.zero]), (j < right.zero ? 0 : right[j - right.zero]), carry); dq.push( tmp ); } while ( i < left.size + left.zero ) { SUM(tmp, (i < left.zero ? 0 : left[i - left.zero]), 0, carry); dq.push( tmp ); ++i; } while ( j < right.size + right.zero ) { SUM(tmp, 0, (j < right.zero ? 0 : right[j - right.zero]), carry); dq.push( tmp ); ++j; } if ( carry ) dq.push( carry ); while ( dq.size > 1 && dq[dq.size - 1] == 0 ) dq.pop(); return dq; } deque<short> operator -(const deque<short> &left, const deque<short> &right) { int i, j; deque<short> dq( left ); for (i = 0, j = 0; i < left.size && j < right.size; ++i, ++j) { if ( dq[i] < right[j] ) { --dq[i + 1]; dq[i] += 10 - right[j]; } else { dq[i] -= right[j]; } } while ( i < left.size ) { if ( dq[i] < 0 ) { --dq[i + 1]; dq[i] += 10; } ++i; } while ( dq.size > 1 && dq[dq.size - 1] == 0 ) dq.pop(); return dq; } deque<short> operator *(const deque<short> &left, const short &right) { int i, carry, tmp; deque<short> dq; carry = 0; for (i = 0; i < left.size; ++i) { MUL(tmp, left[i], right, carry); dq.push( tmp ); } if ( carry ) dq.push( carry ); while ( dq.size > 1 && dq[dq.size - 1] == 0 ) dq.pop(); return dq; } void myRead(deque<short> &left, deque<short> &right, char &opr, const char *buffer) { unsigned len; int i; left.size = right.size = 0; len = strlen( buffer ); for (i = len - 1; isdigit( buffer[i] ); --i) right.push( buffer[i] - '0' ); opr = buffer[i--]; for ( ; i >= 0; --i) left.push( buffer[i] - '0' ); } void myPrint(const deque<short> &dq, const char &opr, const int &mx) { int i, _mx = mx - dq.size; if ( opr ) --_mx; for (i = 0; i < _mx; ++i) putchar(' '); if ( opr ) putchar( opr ); for (i = dq.size - 1; i >= 0; --i) printf("%i", dq[i]); puts( "" ); } void myPrintDash(const int &mx, const int &width) { static int i; for (i = 0; i < width; ++i) putchar(' '); for (i = 0; i < mx; ++i) putchar('-'); puts( "" ); } int main() { /* freopen("input.txt", "r", stdin);*/ int testCase, mx, mx2; char buffer[1002]; deque<short> left, right, result; static deque<deque<short>, 510> mulResult; char opr; scanf("%i", &testCase); getchar(); while ( testCase-- ) { scanf("%s", buffer); myRead(left, right, opr, buffer); if ( opr != '*' ) { result = (opr == '+' ? left + right : left - right); mx = __max(__max(left.size, right.size + 1), result.size); myPrint(left, 0, mx); myPrint(right, opr, mx); myPrintDash(right.size + 1, mx - right.size - 1); myPrint(result, 0, mx); } else { for (int i = 0; i < mulResult.size; ++i) mulResult[i].size = 0; mulResult.size = 0; result.size = 0; mx2 = 0; mx = __max(left.size, right.size + 1); for (int i = 0; i < right.size; ++i) { mulResult.push( left * right[i] ); mulResult[i].zero = i; result = result + mulResult[mulResult.size - 1]; mx = __max(mx, result.size); mx2 = __max(mx2, mulResult[mulResult.size - 1].size + mulResult[mulResult.size - 1].zero); } myPrint(left, 0, mx); myPrint(right, opr, mx); if ( mulResult.size > 1 ) { myPrintDash(right.size + 1, mx - right.size - 1); for (int i = 0; i < mulResult.size; ++i) myPrint(mulResult[i], 0, mx - mulResult[i].zero); myPrintDash(mx2, mx - mx2); } else { myPrintDash(__max(left.size, right.size + 1), mx - __max(left.size, right.size + 1)); } myPrint(result, 0, mx); } puts( "" ); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator