十进制数据相减(大数据)

#ifndef UNICODE
typedef string _tstring;
#else
typedef wstring _tstring;
#endif //!
bool isSmaller(_tstring str1, _tstring str2) {
	int n1 = str1.length(), n2 = str2.length();

	if (n1 < n2) {
		return true;
	}
	if (n2 < n1) {
		return false;
	}

	for (int i = 0; i < n1; i++) {
		if (str1[i] < str2[i]) {
			return true;
		}
		else if (str1[i] > str2[i]) {
			return false;
		}
	}
	return false;
}
/***********************************************************************
函数名称  :SubBigDataAux
函数功能  :两个大数据数值相减(必须正整数)
函数参数  : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息
@param _tstring str1 _IN_ 第一个相减的数值
@param _tstring str2 _IN_ 第二个相减的数值
@param bool bRemovePrex=true 是否移除前导的0 
返回值    : @return _tstring 两个数值相减的结果
------------------------------------------------------------------------
备注      :
输入的参数的要求:“必须是正数”
如果确保数据是正整数的话,请使用SubBigDataAux,这个函数运行的效率更高
如果不能够保证输入参数是正整数的话,请使用SubBigData这个函数
------------------------------------------------------------------------
示例	  :
************************************************************************/
_tstring SubBigDataAux(_tstring str1, _tstring str2,bool bRemovePrex=true) {
	bool bNeg = false;
	if (isSmaller(str1, str2))
	{
		swap(str1, str2);
		bNeg = true;
	}


	_tstring str = L"";

	int n1 = str1.length(), n2 = str2.length();

	reverse(str1.begin(), str1.end());
	reverse(str2.begin(), str2.end());

	int carry = 0;

	for (int i = 0; i < n2; i++) {
		int sub = ((str1[i] - '0') - (str2[i] - '0') - carry);

		if (sub < 0) {
			sub = sub + 10;
			carry = 1;
		}
		else {
			carry = 0;
		}

		str.push_back(sub + '0');
	}

	for (int i = n2; i < n1; i++) {
		int sub = ((str1[i] - '0') - carry);
		carry = 0;
		str.push_back(sub + '0');
	}

	reverse(str.begin(), str.end());
	if (bRemovePrex)
	{
		//去掉前导的‘0’
		while (true)
		{
			if (str[0] == L'0')
			{
				str.erase(str.begin());
			}
			else
			{
				break;
			}
		}
	}
	if (str.empty())
	{
		str = L"0";
	}
	if (bNeg)
	{
		str.insert(str.begin(), L'-');
	}
	return str;
}
/***********************************************************************
函数名称  :AddBigData
函数功能  :两个大数据进行相加(必须为正整数 )
函数参数  : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息
@param _tstring s _IN_ 第一个相加的结果
@param _tstring r _IN_ 第二个相加的结果
返回值    : @return _tstring  两个整数相加的结果
------------------------------------------------------------------------
备注      :
输入的参数的要求:“必须是正整数”
如果确保数据是正整数的话,请使用AddBigDataAux,这个函数运行的效率更高
如果不能够保证输入参数是正整数的话,请使用AddBigData这个函数
------------------------------------------------------------------------
示例	  :
************************************************************************/
_tstring AddBigDataAux(_tstring s, _tstring r) {
	int re = 0;
	_tstring digit;
	if (r.length() < s.length())
		r.insert(r.begin(), s.length() - r.length(), '0');
	else if (r.length() > s.length())
		s.insert(s.begin(), r.length() - s.length(), '0');
	for (int i = s.length() - 1; i >= 0; --i) {
		int a = (int(s[i] + r[i]) + re - 96);
		digit.insert(digit.begin(), char(a % 10 + 48));
		re = a / 10;
	}
	if (re != 0)
		digit.insert(digit.begin(), char(re + 48));
	return digit;
}
/***********************************************************************
函数名称  :SubBigData
函数功能  :两个大数据相减(可以为float型的数据)
函数参数  : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息
@param _tstring s _IN_ 第一个相减的数据
@param _tstring r _IN_ 第二个相加的数据
返回值    : @return 返回两个字符串相减的结果
------------------------------------------------------------------------
备注      :
输入的参数的要求:“必须是正数”,但是可以是浮点型的数据
如果确保数据是正整数的话,请使用SubBigDataAux,这个函数运行的效率更高
如果不能够保证输入参数是正整数的话,请使用SubBigData这个函数
------------------------------------------------------------------------
示例	  :
************************************************************************/
_tstring SubBigData(_tstring s, _tstring r)
{
	size_t pos1 = s.find(L'.');
	size_t pos2 = r.find(L'.');
	_tstring SInt, SFac, RInt, RFac;//两个字符串的整数部分和小数部分
	if (pos1 == _tstring::npos)//如果没有找到的话
	{
		SInt = s;
		SFac = L"";
	}
	else
	{
		SInt = s.substr(0, pos1);
		SFac = s.substr(pos1 + 1);
	}
	if (pos2 == _tstring::npos)
	{
		RInt = r;
		RFac = L"";
	}
	else
	{
		RInt = r.substr(0, pos2);
		RFac = r.substr(pos2 + 1);
	}
	_tstring Int, Fac;//整数相减的结果、浮点数相减的结果
	if (SFac.length() > RFac.length())
	{
		RFac.insert(RFac.end(), SFac.length() - RFac.length(), '0');
	}
	else
	{
		SFac.insert(SFac.end(), RFac.length() - SFac.length(), '0');
	}
	bool bNeg = false;
	if (isSmaller(SInt, RInt))
	{
		swap(SInt, RInt);
		swap(SFac, RFac);
		bNeg = true;
	}
	else if ((SInt==RInt)&&(isSmaller(SFac,RFac)))
	{
		swap(SInt, RInt);
		swap(SFac, RFac);
		bNeg = true;
	}
	Int = SubBigDataAux(SInt, RInt);
	Fac = SubBigDataAux(SFac, RFac,false);
	if (Fac.find(L'-') != _tstring::npos)//如果相减为负数的话,说明要进行进制操作
	{
		_tstring temp = L"1";
		temp.insert(temp.end(), SFac.length(), L'0');
		temp = AddBigDataAux(temp, SFac);
		Fac = SubBigDataAux(temp, RFac);//小数处理部分
		Fac.insert(Fac.begin(), L'.');
		//整数处理部分
		if (Int.find(L'-') != _tstring::npos)
		{
			Int.erase(Int.begin());
			Int = SubBigDataAux(Int, L"1");
			Int.insert(Int.begin(), L'-');
		}
		else
		{
			Int = SubBigDataAux(Int, L"1");
		}
	}
	else
	{
		//小数部分
		Fac.insert(Fac.begin(), L'.');
	}
	_tstring result = Int + Fac;
	if (bNeg)
	{
		result.insert(result.begin(), L'-');
	}
	return result;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值