大数相加算法,基于C++
2018-01-28 21:00
302 查看
自己在做蓝桥杯题目是,发现了很多需要大数计算的算法,查阅相关资料,东西冗杂,决定自己写算法。
先做大数相加算法。
两个相加的大数的极限就是编译器字符串能接纳位数的极限。
采用C++中得string类作为容器。首先准备三个容器,str1与str2接受数据,result接纳相加结果,原理就是模拟加法的手工计算,先从低位开始相加,若超过10则进1。
其中有很多细节性问题,我列举一下:
1、str1要作为位数最长的一个,方便计算,因此要首先确保str1位数最长,可以通过两数交换实现。
2、result初始状态的长度要与str1相同,但是在运算过程中可能发生两数相加,结果长度超过了其中最长的一位,比如900+300,很显然,结果是4位,这种结果的出现只可能是两个位数相同的数相加才可能发生,而且最多超出1位。因此我们必须考虑到这种情况,解决办法如果是我们发现了最高位需要进位,则令result = ‘1’+ result;将1放在首位就解决了。另外在最后输出我们的字符串的长度为length + 1,因为我们可能最高位进位了,长度+1,就算没有进位,也没有关系,我们将输出一个\0,也就是空字符。
下面是代码,算法比较粗糙,大家有意见,及时指正。
先做大数相加算法。
两个相加的大数的极限就是编译器字符串能接纳位数的极限。
采用C++中得string类作为容器。首先准备三个容器,str1与str2接受数据,result接纳相加结果,原理就是模拟加法的手工计算,先从低位开始相加,若超过10则进1。
其中有很多细节性问题,我列举一下:
1、str1要作为位数最长的一个,方便计算,因此要首先确保str1位数最长,可以通过两数交换实现。
2、result初始状态的长度要与str1相同,但是在运算过程中可能发生两数相加,结果长度超过了其中最长的一位,比如900+300,很显然,结果是4位,这种结果的出现只可能是两个位数相同的数相加才可能发生,而且最多超出1位。因此我们必须考虑到这种情况,解决办法如果是我们发现了最高位需要进位,则令result = ‘1’+ result;将1放在首位就解决了。另外在最后输出我们的字符串的长度为length + 1,因为我们可能最高位进位了,长度+1,就算没有进位,也没有关系,我们将输出一个\0,也就是空字符。
下面是代码,算法比较粗糙,大家有意见,及时指正。
#include<iostream> #include<string> using namespace std; int main() { int i = 0, j = 0; string temp = "0"; string str1; string str2; cin>>str1>>str2; //接受数据 if(str1.length() < str2.length()) { //交换两个字符串,使位数长的位于str1 temp = str1; str1 = str2; str2 = temp; } long length1 = str1.length(); long length2 = str2.length(); long length = length1; string result(length, '0'); //两数相加,超过10进1 for(i = length - 1, j = length2 - 1; i >= 0 && j >= 0; i--, j--) { long sum = 0; sum = (str2[j] - '0') + (str1[i] - '0') + (result[i] - '0'); if(sum > 9) { sum %= 10; result[i] = sum + '0'; if(i != 0) result[i-1] = '1'; else result = '1' + result; } else { result[i] = sum + '0'; } } //str2的长度小于str1的话,将剩余的str1加到result上 for(;i >= 0; i--) { long sum = 0; sum = (str1[i] - '0') + (result[i] - '0'); if(sum > 9) { sum %= 10; { result[i] = (sum + 1) + '0'; } result[i-1] = '1'; } else { result[i] = sum + '0'; } } //输出结果,注意length+1 for(i = 0; i < length + 1; i++) cout<<result[i]; return 0; }
相关文章推荐
- 基于C++的string类的大数相加的一种算法
- C/C++语言最新华为机试题“大数相加算法”
- C/C++“大数相加算法”
- 大数相加的C++简单实现
- 【算法】排序 (三):二叉树排序&基于散列排序(C++实现)
- 【C++】两个大数相加之HuaWei上机
- 复习C/C++编程之大数相加
- C++与matlab混合编程基于主成份分析算法的数值分析(一)
- 基于C++的Lagrange插值法算法
- C++实现的大数相乘算法示例
- 【c++】大数相加
- hdoj 1002 a+b 大数相加 C++
- Linux C/C++ 编程练手 --- 大数相加和大数相乘
- 匈牙利算法的C++实现(基于OpenCV)
- C++ 大数相乘算法
- C/C++编程小练习 大数减法之浮点大数减法算法
- C++ 大数相加
- 【算法拾遗】大数相加(不开辟额外空间)
- C++实现的O(n)复杂度内查找第K大数算法示例
- C++实现——大数相加