大数加减乘除---C++运算符重载
程序员文章站
2022-06-26 10:02:34
...
#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;
}
下一篇: ps蒙版和高斯模糊制作彩色透明的水滴