欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大数加减乘除---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;
}

 

相关标签: 大数加减