BigData BigData::operator-(const BigData& bigData) { if (!IsINT64Overflow() && !bigData.IsINT64Overflow()) { if (m_strData[0] == bigData.m_strData[0]) { return BigData(m_llValue - bigData.m_llValue); } else { if ((m_strData[0] == '+' && MAX_INT64 + bigData.m_llValue >= m_llValue) || (m_strData[0] == '-' && MIN_INT64 + bigData.m_llValue <= m_llValue)) { return BigData(m_llValue - bigData.m_llValue); } } } std::string strret; if (m_strData[0] != bigData.m_strData[0]) { strret = Add(m_strData, bigData.m_strData); } else { strret = Sub(m_strData, bigData.m_strData); } return BigData(strret.c_str()); }
BigData BigData::operator* (const BigData& bigdata) { if (!IsOverFlowINT64() && !bigdata.IsOverFlowINT64()) { if (_value == 0 || bigdata._value == 0) { return BigData((INT64) 0); } //10 /2 = 5 >= 3 10 / -2 = -5 <= -4 if (_pData[0] == bigdata._pData[0]) { if ((_pData[0] == '+' && LLONG_MAX / _value >= bigdata._value) || (_pData[0] == '-' && LLONG_MAX / _value <= bigdata._value)) { return BigData(_value * bigdata._value); } } else { // -10 / 2 = -5 <= -4 -10 / -2 = 5 >= 4 if ((_pData[0] == '+' && (LLONG_MIN /_value <= bigdata._value)) || (_pData[0] == '-' && (LLONG_MIN / _value >= bigdata._value))) { return BigData(_value * bigdata._value); } } } return BigData((char *)Mul(_pData, bigdata._pData).c_str()); }
BigData BigData::operator-(const BigData& bigData) { if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow()) { if (m_strData[0] == bigData.m_strData[0]) { return BigData(m_llValue - bigData.m_llValue); } else { //10+(-8) if (('+' == m_strData[0] && MAX_INT64 + bigData.m_llValue >= m_llValue) || ('-' == m_strData[0] && MIN_INT64 + bigData.m_llValue <= m_llValue)) { return BigData(m_llValue - bigData.m_llValue); } } } //1.至少有一个操作数溢出 //2.相减的结果一定会溢出 //9999999999 “-111111” std::string strRet; if (m_strData[0] != bigData.m_strData[0]) { strRet = Add(m_strData, bigData.m_strData); } else { strRet = Sub(m_strData, bigData.m_strData); } return BigData(strRet.c_str()); }
BigData BigData::operator*(const BigData& bigData) { if (m_llValue == 0 || bigData.m_llValue == 0) { return BigData(INT64(0)); } if (!IsINT64Overflow() && !bigData.IsINT64Overflow()) { if (m_strData[0] == bigData.m_strData[0]) { if ((m_strData[0] == '+' && MAX_INT64 / m_llValue >= bigData.m_llValue) || (m_strData[0] == '-' && MAX_INT64 / m_llValue <= bigData.m_llValue)) { return BigData(m_llValue * bigData.m_llValue); } } else { if ((m_strData[0] == '+' && MIN_INT64 / m_llValue <= bigData.m_llValue) || (m_strData[0] == '-' && MIN_INT64 / m_llValue >= bigData.m_llValue)) { return BigData(m_llValue * bigData.m_llValue); } } } return BigData(Mul(m_strData, bigData.m_strData).c_str()); }
BigData BigData::operator*(const BigData& bigData) { if (0 == m_llValue || 0 == bigData.m_llValue) { return BigData(INT64(0)); } if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow()) { if (m_strData[0] == bigData.m_strData[0]) { if (('+' == m_strData[0] && MAX_INT64 / m_llValue >= bigData.m_llValue) || ('-' == m_strData[0] && MAX_INT64 / m_llValue <= bigData.m_llValue)) { return BigData(m_llValue*bigData.m_llValue); } } else { //-10/2 //-10/-2 if (('+' == m_strData[0] && MIN_INT64 / m_llValue <= bigData.m_llValue) || ('-' == m_strData[0] && MIN_INT64 / m_llValue >= bigData.m_llValue)) { return BigData(m_llValue*bigData.m_llValue); } } } return BigData(Mul(m_strData, bigData.m_strData).c_str()); }
BigData BigData::operator+(BigData& bigData) { if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow()) //没有溢出 { if (m_strData[0] != bigData.m_strData[0]) //异号 { return BigData(m_llValue + bigData.m_llValue); } else { if (('+' == m_strData[0] && MAX_INT64 - m_llValue <= bigData.m_llValue) || ('-' == m_strData[0] && MIN_INT64 - m_llValue >= bigData.m_llValue)) { return BigData(m_llValue + bigData.m_llValue); } } } std::string strRet; if (m_strData[0] == bigData.m_strData[0]) { return BigData((char*)Add(m_strData, bigData.m_strData).c_str()); //strRet = Add(m_strData, bigData.m_strData); } /*else { }*/ return BigData((char*)Sub(m_strData, bigData.m_strData).c_str()); }
BigData BigData::operator-(const BigData& bigData) { if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow()) { if (m_strData[0] == bigData.m_strData[0]) { return BigData(m_llValue - bigData.m_llValue); } else { // 10 + (-8) = 2 > 1// 3 - (-8); 1 - (-8) // -10 -8 3 -8 2 -10 + 3 = -7 <= if (('+' == m_strData[0] && MAX_INT64 + bigData.m_llValue >= m_llValue) || ('-' == m_strData[0] && MIN_INT64 + bigData.m_llValue <= m_llValue)) { return BigData(m_llValue - bigData.m_llValue); } } } // 1、至少有一个操作数溢出 // 2、相减的结果一定会溢出 // "999999999" "-111111" "-9999999" "1111111" std::string strRet; if (m_strData[0] != bigData.m_strData[0]) { strRet = Add(m_strData, bigData.m_strData); } else { strRet = Sub(m_strData, bigData.m_strData); } return BigData(strRet.c_str()); }
BigData BigData::operator*(const BigData& bigData) { if (0 == m_llValue || 0 == bigData.m_llValue) { return BigData(INT64(0)); } if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow()) { if (m_strData[0] == bigData.m_strData[0])//同号 { // 10 /2 = 5 >= 1 2 3 4 5 // 10 /-2 = -5 <= -5 -4 -3 -2 -1 if (('+' == m_strData[0] && MAX_INT64 / m_llValue >= bigData.m_llValue) || ('-' == m_strData[0] && MAX_INT64 / m_llValue <= bigData.m_llValue)) { return BigData(m_llValue*bigData.m_llValue); } } else//不同号 { // -10 /2 = -5 <= // -10/-2 = 5 > if (('+' == m_strData[0] && MIN_INT64 / m_llValue <= bigData.m_llValue) || ('-' == m_strData[0] && MIN_INT64 / m_llValue >= bigData.m_llValue)) { return BigData(m_llValue*bigData.m_llValue); } } } return BigData(Mul(m_strData, bigData.m_strData).c_str()); }
BigData BigData:: operator%(const BigData& bigdata) { if (bigdata._strData[1] == '0') { cout << "除数为 0 或对0求模" << endl; assert(0); } if (_strData[1] == 0) return INT64(0); if ((IsINT64OverFlow()) && bigdata.IsINT64OverFlow()) { return _value % bigdata._value; } if (_strData.size() < bigdata._strData.size()) { return BigData(_strData.c_str()); } else if (_strData.size() == bigdata._strData.size()) { if (strcmp(_strData.c_str() + 1, bigdata._strData.c_str() + 1) < 0) return INT64(0); if (strcmp(_strData.c_str() + 1, bigdata._strData.c_str() + 1) == 0) { return INT64(0); } } return BigData(Mod(_strData, bigdata._strData).c_str()); }
BigData BigData::operator + (const BigData& bigdata) { if (!IsOverFlowINT64() && !bigdata.IsOverFlowINT64()) { if (_pData[0] != bigdata._pData[0]) { return BigData(_value + bigdata._value); } else { if ((_pData[0] == '+' && (LLONG_MAX - _value >= bigdata._value)) || (_pData[0] == '-' && (LLONG_MIN - _value <= bigdata._value))) { return BigData(_value + bigdata._value); } } } if (_pData[0] == bigdata._pData[0]) { return BigData( (char *) Add(_pData, bigdata._pData).c_str() ); } return BigData((char *)Sub(_pData, bigdata._pData).c_str()); }
BigData BigData::operator*(const BigData& bigdata) { if ((0 == _value) || (0 == bigdata._value)) { return BigData(INT64(0)); } if (IsINT64OverFlow() && bigdata.IsINT64OverFlow()) { if (_strData[0] == bigdata._strData[0]) { if (((_value > 0) && ((long long)MAX_INT64 / _value >= bigdata._value)) || ((_value < 0) && ((long long)MAX_INT64 / _value <= bigdata._value))) //同号相乘 结果为正 { return BigData(_value*bigdata._value); } } else { if (((_value > 0) && ((long long)MIN_INT64 / _value <= bigdata._value)) || ((_value < 0) && ((long long)MIN_INT64 / _value >= bigdata._value))) //异号相乘 结果为负 { return BigData(_value*bigdata._value); } } } return BigData(Mul(_strData, bigdata._strData).c_str()); }
BigData BigData::operator-(const BigData& bigdata) //- 减法运算符重载 { if (IsINT64OverFlow() && bigdata.IsINT64OverFlow()) { if (_strData[0] == bigdata._strData[0]) { return BigData(_value - bigdata._value); } else { INT64 temp_max = _value - MAX_INT64; INT64 temp_min = _value - MIN_INT64; //10 -3 =7 5 //(-10)-(-3)=-7 -5 if (((_value >= 0) && (temp_max <= bigdata._value)) || ((_value < 0) && (temp_min >= bigdata._value))) { return BigData(_value - bigdata._value); } } } if (_strData[0] == bigdata._strData[0]) { return BigData(Sub(_strData, bigdata._strData).c_str()); } else { string ptr(bigdata._strData); ptr[0] = _strData[0]; return Add(_strData, ptr).c_str(); } }
BigData BigData::operator/(const BigData& bigData) { if (bigData.m_llValue == 0) { assert("³ýÊý²»ÄÜΪ0"); return BigData(INT64(0)); } if (!IsINT64Overflow() && bigData.IsINT64Overflow()) { return BigData(m_llValue / bigData.m_llValue); } return BigData(Div(m_strData, bigData.m_strData).c_str()); }
//除 BigData BigData::operator /(const BigData& bigData) { if (0 == bigData.m_llValue) { assert("除数不能为0!"); return BigData(INT64(0)); } if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow()) { return BigData(m_llValue / bigData.m_llValue); } return BigData(Div(m_strData, bigData.m_strData).c_str()); }
BigData BigData::operator+(const BigData& bigdata) //+ 加法运算符重载 { if (IsINT64OverFlow() && bigdata.IsINT64OverFlow()) { if (_strData[0] != bigdata._strData[0]) { return BigData(_value + bigdata._value); } else { INT64 temp_max = MAX_INT64 - _value; INT64 temp_min = MIN_INT64 - _value; //10 -3 =7 5 //(-10)-(-3)=-7 -5 if (((_value >= 0) && (temp_max >= bigdata._value)) || ((_value < 0) && (temp_min <= bigdata._value))) { return BigData(_value + bigdata._value); } } } if (_strData[0] == bigdata._strData[0]) { return BigData(Add(_strData, bigdata._strData).c_str()); } else { if (_strData[0] == '+') { string ptr(bigdata._strData); ptr[0] = '+'; return Sub(_strData, ptr).c_str(); } else { string ptr(_strData); ptr[0] = '+'; return Sub(bigdata._strData, ptr).c_str(); } } }
BigData BigData::operator / (const BigData& bigdata) { if (bigdata._pData == "+0") { assert(false); std::cout << "FileName :" <<__FILE__ << "Line :" << __LINE__ << std::endl; } if (_pData == "+0") { return BigData((INT64)0); } int LSize = _pData.size(); int RSize = bigdata._pData.size(); if (LSize < RSize || (LSize == RSize && strcmp(_pData.c_str() + 1, bigdata._pData.c_str() + 1) < 0)) { return BigData((INT64)0); } if (strcmp(_pData.c_str() + 1, bigdata._pData.c_str() + 1) == 0) { if (_pData[0] == bigdata._pData[0]) { return BigData((INT64)1); } else { return BigData((INT64)-1); } } if (bigdata._pData == "+1") { return *this; } if (bigdata._pData == "-1") { std::string strRet(_pData); if (strRet[0] == '+') { strRet[0] = '-'; _value = 0 - _value; } else { strRet[0] = '+'; _value = 0 - _value; } return BigData((char *)strRet.c_str()); } //LSize > RSize return BigData((char *)Div(_pData, bigdata._pData).c_str()); }
BigData BigData::operator+(BigData& bigData) { // 8 + -2 10 if (!IsINT64Owerflow() && !bigData.IsINT64Owerflow())//相加的两个数据都未溢出 { if (m_strData[0] != bigData.m_strData[0]) { return BigData(m_llValue+bigData.m_llValue);//编译器支持 } else//同号 { // 2 + 8 10 - 6 > 2 // -3 + -8 -10 - (-6) = -4 < -3 if (('+' == m_strData[0] && MAX_INT64 - m_llValue >= bigData.m_llValue) || ('-') == m_strData[0] && MIN_INT64 - m_llValue <= bigData.m_llValue) { return BigData(m_llValue+bigData.m_llValue); } } } //溢出至少一个 // 2 + 2 / -2 + -2 == -(2+2) // 2 + -1 std::string strRet; if (m_strData[0] == bigData.m_strData[0]) { strRet = Add(m_strData, bigData.m_strData); } else//不同号 { strRet = Sub(m_strData, bigData.m_strData); } return BigData(strRet.c_str()); }
BigData BigData::operator - (const BigData& bigdata) { //BigData ret; BigData Left((char *)_pData.c_str()); BigData Right((char *)bigdata._pData.c_str()); if (bigdata._pData[0] == '+') { Right._pData[0] = '-'; Right._value = 0 - Right._value; } else { Right._pData[0] = '+'; Right._value = 0 - Right._value; } return BigData((char *)(Left + Right)._pData.c_str()); }
void testMul() { BigData b1("-45353"); BigData b2("37353753"); BigData b3("-9223372036854775808"); BigData b4(" 9223372036854775800"); BigData b5("-9223372036854775810"); BigData b6(" 9223372036854775900"); //1、都在INT64范围内<运算后在范围内,运算后不在范围内>(再进行构造可以解决) cout << (BigData("999") * BigData("22222222222222222222222222222")) << endl; cout << (b2 * b1) << endl; cout << (b1 * b2) << endl; cout << (b1 * BigData("0")) << endl; cout << (BigData("0") * b2) << endl; cout << endl; cout << (b3 * b1) << endl; cout << (b1 * b3) << endl; cout << (b1 * b4) << endl; cout << (b4 * b1) << endl; cout << (b3 * b2) << endl; cout << (b2 * b4) << endl; cout << endl; //2、一个在一个不在<运算后在范围内,运算后不在范围内> cout << (BigData("0") * b6) << endl; cout << (b5 * BigData("0")) << endl; cout << (b5 * b1) << endl; cout << (b1* b5) << endl; cout << endl; cout << (b6 * b2) << endl; cout << (b2 * b6) << endl; cout << endl; cout << (b6 * b5) << endl; cout << (b5 * b6) << endl; cout << (b2 * b5) << endl; cout << endl; cout << (b1 * b6) << endl; cout << (b6 * b1) << endl; }