#include "stdafx.h" #include <iostream> #include <cassert> using namespace std; class BigNumber { public: BigNumber(); BigNumber(_int64 n); BigNumber(const BigNumber& other); BigNumber& operator= (const BigNumber& other); ~BigNumber(); friend ostream& operator<< (ostream &out, const BigNumber &other); BigNumber operator* (const BigNumber& other) const; BigNumber operator/ (const BigNumber& other) const; BigNumber operator+ (const BigNumber& other) const; BigNumber operator* (const int n) const; // 0=<n<=9,n为数字 int GetBits() const; private: enum {LEN = 50}; char arr[LEN]; }; int main() { BigNumber big(10023); BigNumber big2(12004); cout<<big2*big<<endl; cout<<10023*12004<<endl; return 0; } /************************************************************************/ /* 函数功能:构造函数 */ /************************************************************************/ BigNumber::BigNumber() { memset(arr, '0', sizeof(arr)); } /************************************************************************/ /* 函数功能:有参构造函数 */ /************************************************************************/ BigNumber::BigNumber(_int64 n) { memset(arr, '0', sizeof(arr)); int pos = LEN - 1; while(n != 0) { arr[pos] = n%10 + '0'; n /= 10; pos--; } } /************************************************************************/ /* 函数功能:拷贝构造函数 */ /************************************************************************/ BigNumber::BigNumber(const BigNumber& other) { memset(arr, '0', LEN); for (int i=0; i<LEN; i++) arr[i] = other.arr[i]; } /************************************************************************/ /*函数功能:重载赋值运算符 */ /************************************************************************/ BigNumber& BigNumber::operator= (const BigNumber& other) { if(this == &other) return *this; memset(arr, '0', LEN); for (int i=0; i<LEN; i++) arr[i] = other.arr[i]; return *this; } /************************************************************************/ /* 函数功能:析构函数 */ /************************************************************************/ BigNumber::~BigNumber() {} /************************************************************************/ /* 函数功能:重载输出运算符 */ /************************************************************************/ ostream& operator<< (ostream &out, const BigNumber &other) { int i; for(i=0; i < other.LEN; ++i) { if(other.arr[i] != '0') break; } for (int j=i; j<other.LEN; j++) { cout<<other.arr[j]-'0'; } return out; } /************************************************************************/ /* 函数功能:重载乘法 */ /************************************************************************/ BigNumber BigNumber::operator* (const BigNumber& other) const { BigNumber reslut; int end1 = LEN - other.GetBits(); int end2 = LEN - GetBits(); int res; for (int i=LEN-1; i>=end1; i--) //乘数 { int k = i; int up = 0;//进位标识 BigNumber temp; for (int j=LEN-1; j>=end2; j--) //被乘数 { res = (other.arr[i] - '0') * (arr[j] - '0') + up; if (res >= 10) { temp.arr[k--] = res % 10 + '0'; up = res / 10; } else { temp.arr[k--] = res + '0'; up = 0; } } reslut = reslut + temp; } return reslut; } /************************************************************************/ /* 函数功能:重载加法 */ /************************************************************************/ BigNumber BigNumber::operator+ (const BigNumber& other) const { BigNumber result ; int res = 0; int up = 0;//进位标识 int end = LEN - max(GetBits(), other.GetBits()); //循环结束的位置,可以减少不必要的+操作 for (int i= LEN-1; i>=end; i--) { res = (arr[i] - '0') + (other.arr[i] - '0') + up; if(res >= 10) { result.arr[i] = res - 10 + '0'; up = 1; } else { result.arr[i] = res + '0'; up = 0; } } return result; } /************************************************************************/ /* 函数功能:统计有效的位数 */ /************************************************************************/ int BigNumber::GetBits() const { int i=0; for (;i<LEN; ++i) { if (arr[i] != '0') { break; } } return LEN - i; } /************************************************************************/ /*函数功能: 重载乘法运算符 */ /************************************************************************/ BigNumber BigNumber::operator* (const int n)const { BigNumber result; int end = LEN - GetBits(); int up = 0; //进位标识 int res = 0; for (int i= LEN-1; i>=end; i--) { res = (arr[i] - '0') * n + up; if (res >= 10) { result.arr[i] = res % 10 + '0'; up = res / 10; } else { result.arr[i] = res + '0'; up = 0; } } return result; } /************************************************************************/ /* 函数功能:重载除法运算符/ */ /************************************************************************/ BigNumber BigNumber::operator /(const BigNumber& other) const { BigNumber result; return result; }