大數加減乘除---C++運算子過載
阿新 • • 發佈:2018-11-11
#include <iostream> #include <typeinfo> #include <string> #include <vector> #include <iterator> using namespace std; template<typename T> void _swap(T &a, T &b) { T tmp = T(); tmp = a; a = b; b = tmp; } class BigData { public: //0初始化 BigData(){} BigData(const char *src); BigData(bool flag,int size); BigData(int data); BigData(vector<int>& src); BigData(string &src); BigData operator =(const BigData &data); BigData(const BigData&data); BigData(bool sign,const BigData&data); bool operator >(const BigData &data) const; bool operator <(const BigData &data) const; bool operator ==(const BigData &data) const; bool operator !=(const BigData &data) const; bool operator >=(const BigData &data) const; bool operator <=(const BigData &data) const; BigData operator -(); //取反運算子 BigData operator+(const BigData &src); BigData operator-(const BigData &src); BigData operator *(const BigData &data); BigData operator /(const BigData &data); BigData operator +=(const BigData &daat); BigData operator -=(const BigData &data); BigData operator *=(const BigData &daat); BigData operator /=(const BigData &data); BigData operator ++(); //前置++ BigData operator --(); BigData operator ++(int);//後置++ BigData operator --(int); void show() { if (_data.size() == 0) { cout <<"0"<<endl; return; } if (!_sign) { cout << "-"; } copy(_data.rbegin(), _data.rend(), ostream_iterator<int>(cout, "")); cout << endl; } private: vector<int> _data; bool _sign; }; BigData::BigData(const char *src) { _sign = true; if (src[0] == '-') { _sign = false; } int len = strlen(src); int min = 0; if (!_sign) { min = 1; } for (int i = len - 1; i >= min; i--) { if (src[i] == '-' && i == 0) { _sign = false; break; } _data.push_back(src[i] - '0'); } } BigData::BigData(int data) { if (data < 0) { _sign = false; } else { _sign = true; } int tmp = 0; while (data) { tmp = data % 10; //從低位到高位得到每一位數字 _data.push_back(tmp); //存入每一位數字 data /= 10; } cout << "succeed" << endl; } BigData::BigData(bool sign,const BigData &data) { this->_sign = sign; _data = data._data; cout << "succeed" << endl; } BigData::BigData(bool flag, int size) { _sign = flag; while (size > 0) { _data.push_back(0); size--; } } BigData::BigData(vector<int>& src) { _sign = true; _data = src; cout << "succeed" << endl; } BigData::BigData(const BigData &data) { this->_sign = data._sign; _data = data._data; cout << "succeed" << endl; } BigData::BigData(string &src) { _sign = true; int len = src.size(); for (int i = len - 1; i >= 0; i--) { if (src[i] == '-' && i == 0) { _sign = false; break; } _data.push_back(src[i] - '0'); } } BigData BigData::operator+(const BigData &src) { BigData num1 = *this; BigData num2 = src; if (_sign == true && src._sign == false)//正+負---正-(-負) { num2 = -num2; return num1 - num2; } if (_sign == false && src._sign == true)//負+正---正-(-負) { num1 = -num1; return num2 - num1; } //正正,負負 vector<int>::iterator it1 = num1._data.begin(); vector<int>::iterator it2 = num2._data.begin(); BigData tmp; int add = 0; for (; it1 != num1._data.end() && it2 != num2._data.end();it1++, it2++) { tmp._data.push_back((*it1 + *it2 + add) % 10); add = (*it1 + *it2 + add) / 10; } while (it1 != num1._data.end()) { tmp._data.push_back(*it1++ + add); add = 0; } while (it2 != num2._data.end()) { tmp._data.push_back(*it2++ + add); add = 0; } tmp._sign = this->_sign; return tmp; } BigData BigData::operator-(const BigData &src) { BigData num1 = *this; BigData num2 = src; BigData tmp; if (_sign == true && src._sign == false) //正-負---正+(-負) { num2 = -num2; return num1 + num2; } if (_sign == false && src._sign == true) //負-正---負+(-正) { num2 = -num2; return num1 + num2; } if (_sign == false && src._sign == false) { if (num1 < num2) // { BigData temp(false, (-num1) - (-num2)); return temp; } if (num1 > num2) { BigData temp(true, (-num2) - (-num1)); return temp; } else { return tmp; } } if (_sign == true && src._sign == true) { if (num1 < num2) // { BigData temp(false, (num2 - num1)); //正正 return temp; } } bool flag = true; vector<int>::iterator it1 = num1._data.begin(); vector<int>::iterator it2 = num2._data.begin(); tmp._sign = flag; int add = 0; for (; it1 != num1._data.end() && it2 != num2._data.end(); it1++, it2++) { tmp._data.push_back((*it1 - *it2 )); } while (it1 != num1._data.end()) { tmp._data.push_back(*it1++); add = 0; } for (unsigned int i = 0; i < tmp._data.size() - 1; i++ ) { if (tmp._data[i] < 0) { tmp._data[i] += 10; tmp._data[i + 1] --; } } tmp._sign = this->_sign; return tmp; } bool BigData::operator >(const BigData &data) const { cout << "bool BigData::operator >(const BigData &data) const"<<endl; if (this->_sign != data._sign) //符號不同 { return _sign > data._sign; } if (this->_data.size() > data._data.size()) //符號相同,且this長 { if (this->_sign == true) { return true; } else { return false; } } if (this->_data.size() < data._data.size())//符號相同,且this短 { if (this->_sign == true) { return false; } else { return true; } } for (int i = _data.size() - 1; i >=0; i--) //符號相同,長度相同 { if (_data[i] > data._data[i]) { if (this->_sign == true) { return true; } else { return false; } } else if (_data[i] < data._data[i]) { if (this->_sign == true) { return false; } else { return true; } } } return false; } bool BigData::operator <(const BigData &data) const { cout <<"bool BigData::operator <(const BigData &data) const"<< endl; if (!(*this > data) && !(*this == data)) { return true; } return false; } bool BigData::operator ==(const BigData &data) const { cout <<"bool BigData::operator ==(const BigData &data) const"<< endl; if (this->_data == data._data && this->_sign == data._sign) { return true; } return false; } bool BigData::operator !=(const BigData &data) const { cout <<"bool BigData::operator !=(const BigData &data) const"<< endl; if (!(*this == data)) { return true; } return false; } bool BigData::operator >=(const BigData &data) const { cout <<"bool BigData::operator >=(const BigData &data) const"<< endl; if (*this > data || *this == data) { return true; } return false; } bool BigData::operator <=(const BigData &data) const { if (!(*this > data)) { return true; } return false; } BigData BigData::operator =(const BigData &data) { cout <<"BigData BigData::operator =(const BigData &data)"<<endl; this->_sign = data._sign; this->_data = data._data; return *this; } BigData BigData::operator -() //改變了BigData物件的符號 { this->_sign = !this->_sign; return *this; } BigData BigData::operator *(const BigData &data) { BigData num1(*this); BigData num2(data); int len1 = num1._data.size(); int len2 = num2._data.size(); int size = len1 * len2; bool sign = true; if (num1._sign == true && num2._sign == false) { sign = false; } if (num1._sign == false&&num2._sign == true) { sign = false; } BigData tmp(sign,size); for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { tmp._data[i + j] += num1._data[i] * num2._data[j]; } } for (unsigned int i = 0; i < tmp._data.size()-1; i++) { if (tmp._data[i] >= 10) { tmp._data[i + 1] += tmp._data[i] / 10; tmp._data[i] %= 10; } } while (tmp._data.size() > 1 && tmp._data[tmp._data.size() - 1] == 0) { tmp._data.erase(tmp._data.end()-1); } return tmp; } BigData BigData::operator /(const BigData &data) { BigData tmp; BigData num1 = *this; BigData num2 = data; if (num1 == num2) { tmp._data.push_back(1); tmp._sign = true; } if (num1._sign == false && num2._sign == false) { if (num1 > num2) { return tmp; } num1 = -num1; num2 = -num2; BigData temp = num1/ num2; return temp; } if (num1._sign == true && num2._sign == true) { if (num1 < num2) { return tmp; } tmp._sign = true; } if (num1._sign == false) { num1 = -num1; BigData temp(false, num1 / num2); return temp; } if (num2._sign == false) { num2 = -num2; BigData temp (false,num1 / num2); return temp; } BigData zoro(0); zoro._sign = true; BigData one(1); one._sign = true; int len = num1._data.size(); BigData temp(len,tmp._sign); tmp = temp; while ((num1 = (num1 - num2)) >= zoro) { tmp += one; } return tmp; } BigData BigData::operator +=(const BigData &data) { *this = *this + data; return *this; } BigData BigData::operator -=(const BigData &data) { *this = *this - data; return *this; } BigData BigData::operator *=(const BigData &data) { *this = *this * data; return *this; } BigData BigData::operator /=(const BigData &data) { *this = *this / data; return *this; } BigData BigData::operator ++() { BigData one(1); *this += one; return *this; } BigData BigData::operator --() { BigData one(1); *this -= one; return *this; } BigData BigData::operator ++(int) { BigData temp(*this); BigData one(1); *this += one; return temp; } BigData BigData::operator --(int) { BigData temp(*this); BigData one(1); *this -= one; return temp; } int main() { BigData data1(12442); //int型別構造BigData物件 vector<int> d({ 2,3,2,3,4,5,6,7,5,3,2,4,4,5,6,7,5,3,4,2,5,6 }); BigData data2 = d; //vector<int>型別構造BigData物件 BigData data3("1234565346634436"); //const char*型別構造BigData物件 BigData data4("6543216433333333333333333");//const char*型別構造BigData物件 string dt = "-134423546"; BigData data5(dt); //string型別構造BigData物件 BigData data = data3 + data4; //data3呼叫+方法,data4是引數 BigData data6 = data3 - data4; BigData data8("-12"); BigData data9("24"); data = data3 - data4 - data9; data.show(); data = data8 - data9 - data9; data.show(); data = data8 * data9 * data8; data.show(); data = data9 / data8; data.show(); data++; data.show(); data6.show(); return 0; }