重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、概述
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、泸州网站维护、网站推广。
C/C++中的int类型能表示的范围是-2E31-2E31–1。unsigned类型能表示的范围是0-2E32–1,即 0-4294967295。所以,int和unsigned类型变量,都不能保存超过10位的整数。有时我们需要参与运算的数,可能会远远不止10 位,例如,可能需要保留小数点后面100位(比如求π的值),那么,即便使用能表示很大数值范围的double变量,但是由于double变量只有64位,所以还是不可能达到精确到小数点后面100位这样的精度。double变量的精度也不足以表示一个100位的整数。一般我们称这种基本数据类型无法表示的整数为大数。如何表示和存放大数呢?在c语言下,我们可以用数组存放和表示大整数,一个数组元素,存放大数中的一位。而在c++中,使用标准库的string类型,使得大数问题的计算更加实用(没有最大值的限制),更加灵活(输入更加简洁方便),更加简单(可以方便的处理小数之间的运算)。
二、算法原理简单描述:
看如下大整数的加法运算:
answer每一位都是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<<"Input num1 , num2:"< >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<<"num1: Please input correct form!!!"<
四、运行结果截图:
说明1:此处有一定的容错性,可以处理(.X或X.型的数据)
说明2:(*)表示结果为负数,不再处理
说明3:对输出格式统一控制为小数类型
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对创新互联的支持。