十进制数据相减(大数据)
发布日期:2021-11-07 18:53:29 浏览次数:2 分类:技术文章

本文共 4972 字,大约阅读时间需要 16 分钟。

#ifndef UNICODEtypedef string _tstring;#elsetypedef 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;}

 

转载地址:https://blog.csdn.net/zhanggusheng/article/details/84582000 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:《离散数学及其应用》第七章 第一节
下一篇:十进制数据相加(大数据)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月28日 20时21分55秒