【c++】大数相加
2014-03-01 10:59
267 查看
在实现简单的加法时,我们大都会采用直接相加输出结果,但是如果两个数非常大,已经超出了c++基本数据类型的表示范围时,该如何解决?
c++几种基本数据类型:
可见,如果需要计算大数相加,这些基本类型能力也有限。
现提供一种方法解决大数相加,基于String字符串,大家都知道,String可以表示很长的字符,String 的长度可以是零个字符至大约二十亿个字符。将需要相加的数存为String类型,在想办法将两个数相加即可解决问题。如果学过数据结构,可以有更好的解决方法,如尝试使用链表等可以解决问题,大数相乘等,同样可以使用链表等数据结构解决。
示例:计算123456789987654321+987654321012345 = ?时,先将两个加数存为String类型,再从两个加数的末尾开始,一个数一个数的相加,跟做普通加法一个原理,只是这里需要注意的是,两个加数的类型为字符串,所以如果将其中的数字直接相加,其实是不对的如,如上述问题,中末尾分别为1和5,如果直接相加,则是字符在相加如:
输出结果为:
很显然这不是我们需要的答案,我们想要的是1+5=6;
这里有一个解决方法:在计算的时候将每一个数都减去字符‘0’,这样得到的即为我们需要的数。
c++代码如下:
附上源代码链接:http://download.csdn.net/detail/shanchuan2012/6977551
c++几种基本数据类型:
int 整型 4字节 范围:-2147483648 ~ 2147483647
float 实型(单精度) 4字节 范围:1.18*10@-38 ~ 3.40*10@38 7位有效位(多少次方符号不能显示,以@代替,下同)
double 实型(双精度) 8字节 范围:2.23*10@-308 ~ 1.79*10@308 15位有效位
可见,如果需要计算大数相加,这些基本类型能力也有限。
现提供一种方法解决大数相加,基于String字符串,大家都知道,String可以表示很长的字符,String 的长度可以是零个字符至大约二十亿个字符。将需要相加的数存为String类型,在想办法将两个数相加即可解决问题。如果学过数据结构,可以有更好的解决方法,如尝试使用链表等可以解决问题,大数相乘等,同样可以使用链表等数据结构解决。
示例:计算123456789987654321+987654321012345 = ?时,先将两个加数存为String类型,再从两个加数的末尾开始,一个数一个数的相加,跟做普通加法一个原理,只是这里需要注意的是,两个加数的类型为字符串,所以如果将其中的数字直接相加,其实是不对的如,如上述问题,中末尾分别为1和5,如果直接相加,则是字符在相加如:
string a1 = "1"; string a2 = "5"; cout<<a1 + a2<<endl;
输出结果为:
很显然这不是我们需要的答案,我们想要的是1+5=6;
这里有一个解决方法:在计算的时候将每一个数都减去字符‘0’,这样得到的即为我们需要的数。
c++代码如下:
#include <iostream> #include <string> using namespace std; void main() { string a1 ; string a2 ; cout<<"请输入需要相加的两个大数:"<<endl; cout<<"加数:"<<endl; cin>>a1; cout<<"被加数:"<<endl; cin>>a2; string res; int OneAdd = 0;// int temp2 = 0;// int temp = 0; int min = a1.length()<a2.length() ? a1.length() : a2.length();//比较两个字符串,取较小一个的长度 for(int i=1; i<=min; i++) { OneAdd = (a1[a1.length() - i] - '0' + a2[a2.length() - i] - '0') + temp; temp = OneAdd/10; //需要向前一位的数,如9+8=17,进一位:1 temp2 = OneAdd % 10; //需要保留的,如9+8=17,保留7 res.push_back(temp2 + '0'); //将每次保留的数存入结果字符串,注意顺序是反的,结果需倒置输出 } //将余下的直接添加到结果,注意前面可能前进一位 while(a1.length() > min) { OneAdd = a1[a1.length()-1 - min] - '0' + temp; temp = OneAdd/10; temp2 = OneAdd % 10; res.push_back( temp2 + '0' ); min++; } while(a2.length() > min) { OneAdd = a2[a2.length() - 1 - min] - '0' + temp; temp = OneAdd / 10; temp2 = OneAdd % 10; res.push_back( temp2 + '0' ); min++; } //将res反向输出 cout<<"结果:"<<endl; for(int i=res.length()-1; i>=0 ;i--) { cout<<res[i]; } cout<<endl; }如有疑问请留言!
附上源代码链接:http://download.csdn.net/detail/shanchuan2012/6977551
相关文章推荐
- C++编译器与链接器工作原理
- C++中的前置声明
- C与C++的区别,枚举类型enum
- SEH——Structured Exception Handling(结构化异常处理)
- c++容器总结
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- UVA 10106高精度乘法
- gsoap编译工具的安装与使用(二)----工具的使用及问题的解决
- C语言条件编译及编译预处理阶段
- [C++_4]static_const_mutable
- C++ COM编程生成随机GUID值
- C++中如何表示2进制,8进制、16进制变量
- win环境下c语言04
- C++第1周(春)项目2 胖子伤不起
- C++第1周(春)项目1 用枚举表示对称方式
- 浙大ACM 1002 Fire Net
- 杭电ACM 1002 大数相加
- C++ 中string.find() 函数的用法总结
- C++ 动态分配对象数组
- c++11 tuple实现