c语言任意长度小数加减法,使用C++中string实现任意长度的正小数、整数之间加减法方法实例.pdf...
使使用用C++中中string实实现现任任意意长长度度的的正正小小数数、、整整数数之之间间加加减减法法方方法法实实例例
一一、、概概述述
C/C++中的int类型能表示的范 是-2E31-2E31�C 1。unsigned类型能表示的范 是0 -2E32�C 1,即 0 -4294967295 。所以
,int和unsigned类型变量,都不能保存超过10位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要
保留小数点后面100位 (比如求π的值),那么,即便使用能表示很大数值范 的double变量,但是由于double变量只有64位,
所以还是不可能达到精确到小数点后面100位这样的精度。double变量的精度也不足以表示一个100位的整数。一般我们称这种
基本数据类型无法表示的整数为大数。如何表示和存放大数呢?在c语言下,我们可以用数组存放和表示大整数,一个数组元素
,存放大数中的一位。而在c++中,使用标准库的string类型,使得大数问题的计算更加实用 (没有最大值的限制),更加灵活
(输入更加简洁方便),更加简单 (可以方便的处理小数之间的运算)。
二二、、算算法法原原理理简简单单描描述述::
看看如如下下大大整整数数的的加加法法运运算算::
ans er每一位都是num1、num2和carry 的和,因此,我们在输入加数和被加数的string之后,可以将内容进行一次反转,这
样, answer[i]=num1[i]+num2[i]+carry[i-1] 。反转的一个重要的原因是可以方便的将向前的进位和运算变为向后的进位运
算,有利于充分发挥string 的特点。在这里,我们可以使用头文件下的 reverse() 函数方便的实现string 的内容反
转。当运算完毕后,反转回来即可。
当加入小数点后,我们就需要考虑一些额外的问题--小数点的位置问题,笔者在此采用了如下的策略:将输入内容格式检查之后
(使用了cctpe头文件),将一个数分为小数部分和整数部分,然后先运算小数部分,将得到的carry最后和整数部分一起运算,
最后将两部分的和拼接在一起。
对于大数的减法问题,基本上是大数加法的一个逆运算过程,笔者不在细讲,看源代码就可以很容易的理解。
三三、、程程序序代代码码::
/*
大数的运算1--加法:
利用C++ string实现任意长度正小数、整数之间的加减法
作者:大大维
2017/5/5
*/
include
include
include
include
using namespace std;
string sum(string,string,string,string);
string sub(string,string,string,string);
int main()
{
string num1,num2;
cout<
cin>>num1>>num2;
string num11,num12,num21,num22;
//输入检查
//是否是小数的标志
bool num1Flag=false,num2Flag=false;
for(auto c:num1)
{
//由数字或者数字加一个.组成
if(!isdigit(c)||num1.empty())
{
if(c=='.'&& !num1Flag)
{
num1Flag=true;
}
else
{
cout<
return 0;
}
}
}
for(auto c:num2)
{
if(!isdigit(c)||num2.empty())
{
if(c=='.'&& !num2Flag)
{
num2Flag=true;
}
else
{
cout<
return 0;
}
}
}
//字符串分割{整数部分和小数部分)
if(num1Flag)//如果是小数
{
int i=0;
whi
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
