概述
#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;
}
最后
以上就是单薄发箍为你收集整理的十进制数据相减(大数据)的全部内容,希望文章能够帮你解决十进制数据相减(大数据)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复