实现大数四则运算
发布时间:2021-05-28 05:39:56 所属栏目:大数据 来源:网络整理
导读:副标题#e# ? ? ? ? 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。大数运算主要有加、减、乘三种方法。那么大数到底如何进行运算呢,学习过数
|
大数的乘法运算: BigData?BigData::operator*(const?BigData&?bigdata)
{
if?(IsINT64OverFlow()?&&?bigdata.IsINT64OverFlow())
{
if?(_strData[0]?==?bigdata._strData[0])
{
????//例如:边界是10,10?/?2?=?5?>?4;?10?/?-2?=?-5?<?-4;
if?(_value?>?0?&&?MAX_INT64?/?_value?>=?bigdata._value?||
_value?<?0?&&?MAX_INT64?/?_value?<=?bigdata._value)
{
return?_value*bigdata._value;
}
}
else
{
//例如:边界是-10,-10?/?2?=?-5?<?-4;?-10?/?-2?=?5?>?4;
if?(_value>0?&&?MIN_INT64?/?_value?<=?bigdata._value?||
_value?<?0?&&?MIN_INT64?/?_value?>=?bigdata._value)
{
return?_value*bigdata._value;
}
}
}
//两数至少有一个溢出
if?(_value?!=?0?&&?bigdata._value?!=?0)
{
return?BigData(Mul(_strData,?bigdata._strData).c_str());
}
return?BigData(INT64(0));
}
std::string?BigData::Mul(std::string?left,?std::string?right)
{
int?iLsize?=?left.size();
int?iRsize?=?right.size();
char?cSymbol?=?'+';//确认符号位
if?(left[0]?!=?right[0])
{
cSymbol?=?'-';
}
if?(iLsize?>?iRsize)//使较小的数为left,提高效率。eg:99*12345678
{
swap(left,?right);
swap(iLsize,?iRsize);
}
std::string?sRet;
//两个数相乘最大位数为两个数位数的和,left和right中有符号位故减1
sRet.assign(iLsize?+?iRsize?-?1,?'0');//assign()为字符串赋新值'0'
sRet[0]?=?cSymbol;
int?iDataLen?=?iLsize?+?iRsize?-?1;
int?ioffset?=?0;//移位
//先取左边一位和右边相乘;再考虑移位可得到左边每位与右边相乘的结果
for?(int?iLdx?=?1;?iLdx?<?iLsize;?iLdx++)
{
char?cLeft?=?left[iLsize?-?iLdx]?-?'0';
if?(cLeft?==?0)//如果left中含有0,偏移量加1
{
ioffset++;
continue;
}
char?Step?=?0;
//99*999=89910+8991;
for?(int?iRdx?=?1;?iRdx?<?iRsize;?iRdx++)
{
char?cRet?=?cLeft?*?(right[iRsize?-?iRdx]?-?'0')?+?Step;
cRet?+=?sRet[iDataLen?-?iRdx?-?ioffset]?-?'0';//cRet存放当前位最终乘加的结果
sRet[iDataLen?-?iRdx?-?ioffset]?=?cRet?%?10?+?'0';//存放字符+'0'
Step?=?cRet?/?10;
}
sRet[iDataLen?-?iRsize?-?ioffset]?+=?Step;
ioffset++;
}
return?sRet;
} (编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐

