大数加减法

完成以下类的实现,实现大数加减法

//大整数类型
class BigInt
{
public:
	BigInt(string str) :strDigit(str){}
private:
	string strDigit;   // 使用字符串存储大整数

	friend ostream& operator<<(ostream &out, const BigInt &src);
	friend BigInt operator+(const BigInt &lhs, const BigInt &rhs);
	friend BigInt operator-(const BigInt &lhs, const BigInt &rhs);
};
// 打印函数
ostream& operator<<(ostream &out, const BigInt &src)
{
	out << src.strDigit ;
	return out;
}
// 大数加法
BigInt operator+(const BigInt &lhs, const BigInt &rhs)
{
//1,从后往前遍历lhs和rhs,进行相加操作,相加的过程中考虑借位操作
	int size1 = lhs.strDigit.length();
	int size2 = rhs.strDigit.length();
	bool flag = false;//借位标志
	vector<int>NumVec;
	int i = size1 - 1, j = size2 - 1;
	int sum = 0;
	for (; i >= 0 && j >= 0; --i, --j)
	{
		int num1 = lhs.strDigit[i] - '0';
		int num2 = rhs.strDigit[j] - '0';
		if (flag)
		{
			sum = num1 + num2 + 1;
			flag = false;
		}
		else
		{
			sum = num1 + num2;
		}
		if (sum >= 10)
		{
			flag = true;
		}
		NumVec.push_back(sum%10);
	}
	//哪段数字长,考虑借位继续添加
	for (; i >= 0; --i)
	{
		int num = lhs.strDigit[i] - '0';
		if (flag)
		{
			sum = num + 1;
			flag = false;
		}
		else
		{
			sum = num;
		}
		if (sum >= 10)
		{
			flag = true;
		}
		NumVec.push_back(sum % 10);
	}
	for (; j >= 0; --j)
	{
		int num = rhs.strDigit[j] - '0';
		if (flag)
		{
			sum = num + 1;
			flag = false;
		}
		else
		{
			sum = num;
		}
		if (sum >= 10)
		{
			flag = true;
		}
		NumVec.push_back(sum % 10);
	}
	if (flag)
	{
		NumVec.push_back(1);
	}
	//得到相加的数字,存放到vector中
	//vector中的结果存放到string里面进行返回
	string str = "";
	for (int i = NumVec.size() - 1; i >= 0; --i)
	{
		str.push_back(NumVec[i]+'0');
	}
	return str;
}
// 大数减法
BigInt operator-(const BigInt &lhs, const BigInt &rhs)
{
	BigInt big(""), small("");
	int size1 = lhs.strDigit.length();
	int size2 = rhs.strDigit.length();
	bool flag = false;//借位标记
	bool isMinor = false;//负数标记
	vector<int>NumVec;
	int minor = 0;
	int i = 0, j = 0;
	if (size1 > size2)
	{
		big = lhs;
		small = rhs;
	}
	else if (size1 < size2)
	{
		big = rhs;
		small = lhs;
		isMinor = true;
	}
	else
	{
		for (; i < size1&&j < size2; ++i, ++j)
		{
			if (lhs.strDigit[i]>rhs.strDigit[j])
			{
				big = lhs;
				small = rhs;
				break;
			}
			else if(lhs.strDigit[i] < rhs.strDigit[j])
			{
				big = rhs;
				small = lhs;
				break;
			}
		}
		if (i==size1&&j==size2)
		{
			return "0";
		}
	}
	int m = big.strDigit.size() - 1;
	int n = small.strDigit.size() - 1;
	for (; m >= 0&&n >= 0; --m, --n)
	{
		int num1 = big.strDigit[m] - '0';
		int num2 = small.strDigit[n] - '0';
		if (flag)
		{
			minor = num1-1-num2;
			flag = false;
		}
		else
		{
			minor = num1 - num2;
		}
		if (minor < 0)
		{
			flag = true;
			minor = minor + 10;
		}
		NumVec.push_back(minor);
	}
	for (; m >= 0; --m)
	{
		int num = big.strDigit[m] - '0';
		if (flag)
		{
			minor = num - 1;
			flag = false;
		}
		else
		{
			minor = num;
		}
		if (minor < 0)
		{
			flag = true;
			minor = minor + 10;
		}
		NumVec.push_back(minor);
	}
	if (isMinor)
	{
		NumVec.push_back('-' - '0');
	}

	//string str = "";
	//for (int i = NumVec.size() - 1; i >= 0; --i)
	//{
	//	str.push_back(NumVec[i] + '0');
	//}
	//string::iterator itr =str.begin();
	//while (itr!=str.end())
	//{
	//	if (*itr == '0')
	//	{
	//		if (str.end() == itr + 1)
	//		{
	//			break;
	//		}
	//		itr = str.erase(itr);
	//	}
	//	else
	//	{
	//		break;
	//	}
	//}
	//
	string str = "";
	for (int i = NumVec.size() - 1; i >= 0; --i)
	{
		str.push_back(NumVec[i] + '0');
	}
	int k = 0;
	string::reverse_iterator itr = str.rbegin();
	while (itr != str.rend())
	{
		if (*itr!= 0)
		{
			break;
		}
		else
		{
			itr++;
			k++;
		}
		
	}
	str.substr(0, str.length() - k);
	return str;

}
int main()
{
BigInt int1 = "28937697857832167849697653231243";
BigInt int2 = "9785645649886874535428765";
cout << int1 + int2 << endl;
cout << int1 - int2 << endl;
return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42323413/article/details/84169689