www.gusucode.com > C++四柱汉诺塔源代码-源码程序 > C++四柱汉诺塔源代码-源码程序/code/Number.cpp
//Download by http://www.NewXing.com // Number.cpp: implementation of the Number class. // ////////////////////////////////////////////////////////////////////// #include "Number.h" #include <string.h> #include <iostream> #define max(a,b) (a>b ? a:b) using namespace std; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Number::Number() { data = new char[2]; data[0] = '0'; data[1] = '\0'; } Number::Number(int num) { int len = 1; int quotient = num; while((quotient = quotient/10) != 0) { len++; } data = new char[len+1]; data[len] = '\0'; len--; quotient = num; for(;len>=0;len--) { data[len] = quotient%10+'0'; quotient = quotient/10; } } Number::Number(Number &other) { int length = strlen(other.data); data = new char[length+1]; strcpy(data, other.data); } Number::~Number() { if (data != NULL) { delete []data; data = NULL; } } Number & Number::operator =(const Number &other) { if (this == &other) { return *this; } delete []data; int length = strlen(other.data); data = new char[length+1]; strcpy(data, other.data); return *this; } Number Number::operator +(const Number &other) { int length1 = strlen(data); int length2 = strlen(other.data); int maxLen = max(length1, length2); int overflow = 0; int sum = 0; Number num; if (length1<length2) { delete []num.data; num.data = new char[length2+2]; num.data[length2+1] = '\0'; length1--; length2--; while(length1>=0) { sum = data[length1]-'0'+other.data[length2]-'0'+overflow; overflow = sum/10; sum = sum%10; num.data[length2+1] = sum+'0'; length1--; length2--; } while(length2>=0) { sum = other.data[length2]-'0'+overflow; overflow = sum/10; sum = sum%10; num.data[length2+1] = sum+'0'; length2--; } if (overflow != 0) { num.data[0] = '0'+overflow; } else { char *newData = new char[maxLen+1]; strcpy(newData, &num.data[1]); delete []num.data; num.data = newData; } } else { delete []num.data; num.data = new char[length1+2]; num.data[length1+1] = '\0'; length1--; length2--; while(length2>=0) { sum = data[length1]-'0'+other.data[length2]-'0'+overflow; overflow = sum/10; sum = sum%10; num.data[length1+1] = sum+'0'; length1--; length2--; } while(length1>=0) { sum = data[length1]-'0'+overflow; overflow = sum/10; sum = sum%10; num.data[length1+1] = sum+'0'; length1--; } if (overflow != 0) { num.data[0] = '0'+overflow; } else { char *newData = new char[maxLen+1]; strcpy(newData, &num.data[1]); delete []num.data; num.data = newData; } } return num; } Number & Number::operator *(const Number &other) { return *this; } int Number::Compare(const Number &other) const { int nLen1 = strlen(data); int nLen2 = strlen(other.data); if (nLen1 > nLen2) { return 1; } else if (nLen1 < nLen2) { return -1; } else { return strcmp(data, other.data); } } const Number & Number::MinNum(const Number &num1, const Number &num2) { if (num1.Compare(num2) < 0) { return num1; } else { return num2; } } void Number::Print(void) { cout<<data<<endl; }