实现大数四则运算
发布时间:2021-05-28 05:39:56 所属栏目:大数据 来源:网络整理
导读:副标题#e# ? ? ? ? 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。大数运算主要有加、减、乘三种方法。那么大数到底如何进行运算呢,学习过数
|
大数的减法运算: BigData?BigData::operator-(const?BigData&?bigdata)
{
//两个数都没溢出,结果也没溢出,直接进行相加
if?(IsINT64OverFlow()?&&?bigdata.IsINT64OverFlow())
{
if?(_strData[0]?==?bigdata._strData[0])
{
return?_value?+?bigdata._value;
}
else
{
//两个数异号,相减没溢出
//-10?+?3?=?-7?<=?-6(减式:3-(-6));10+(-3)=?7?>=?6(减式:-3-(6))
if?(_value?>=?0?&&?(MIN_INT64?+?_value?<=?bigdata._value)?||
_value?<?0?&&?(MAX_INT64?+?_value?>=?bigdata._value))
{
return?_value?+?bigdata._value;
}
else
{//不用使bigdata._strData[0]设为'-',Add符号随左边数字即被减数(-9999-1?=?-10000)
BigData(Add(_strData,?bigdata._strData).c_str());
}
}
}
//两个数至少一个溢出,
//同号调用减法
if?(_strData[0]?==?bigdata._strData[0])
{
return?BigData(Sub(_strData,?bigdata._strData).c_str());
}
else
{
return?BigData(Add(_strData,?bigdata._strData).c_str());
}
return?BigData(INT64(0));
}
std::string?BigData::Sub(std::string?left,?std::string?right)
{
int?iLsize?=?left.size();
int?iRsize?=?right.size();
char?cSymbol?=?left[0];//保存所得差的符号位
if?(iLsize?<?iRsize?||?(iLsize==iRsize?&&?left?<?right))//左边小于右边都进行交换
{//-12-(-21)=9,21-34=-13发现两数的差与减数的相反
std::swap(left,right);
std::swap(iLsize,?iRsize);
if?(cSymbol?==?'-')
{
cSymbol?=?'+';
}
else
{
cSymbol?=?'-';
}
}
std::string?sRet;
sRet.resize(iLsize);
sRet[0]?=?cSymbol;//保存符号位
for?(int?iIdx?=?1;?iIdx?<?iLsize;?iIdx++)//结束标志为iLsize-1,不是iLsize
{
//从低到高,取left每一位;
char?cRet?=?left[iLsize?-?iIdx]?-?'0';
//在right范围内从低到高,取right每一位,然后相减;
if?(iIdx?<?iRsize)
{
cRet?-=?right[iRsize?-?iIdx]?-?'0';
}
//判断是否借位
if?(cRet?<?0)
{
left[iLsize?-?iIdx?-?1]?-=?1;
cRet?+=?10;
}
sRet[iLsize?-?iIdx]?=?cRet?+?'0';
}
return?sRet;
}
(编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

