大数相加算法实现
2018-01-30 19:59
381 查看
一、概述
毕业已快半年,想想度过的日子,还是大学时光最安逸。大学时,挺喜欢研究算法,虽然算法很垃圾,但我我就喜欢研究一些有点难度,但经过努力之后我能实现的算法。今天要给大家讲的算法是大数相加,一开始我看到这到算法题,觉得自己可能做不出来,但我还是硬着头皮上了,最终,我还是依照自己的思路解决了这个问题。虽然网上有很多这样的算法,但我就是想把我的思路分享给大家。本文将使用c++语言实现。二、算法实现思想
思想很简单,就是让计算机模拟人的方式去相加,想想你平时加一个多位的数字是怎么加的,我的算法就是怎么实现的。思想就这么简单,让计算机代替我去计算。人们计算多位数相加的思路:
1 2 3 4 5 6 + 3 4 5 6 7 ---------------- 1 5 8 0 2 3
想明白之后,只要让计算机模拟上诉的过程,就可以得到结果了。
具体实现思路:
1. 构建三个数组(一定要将数组初始化为0),第一个数组用来存储第一个加数,第二数组用来存储第二个加数,第三个数组用户存储结果,结果数组的大小必须是最大加数个数加1(有可能进位);
2. 将用户输入的加数拆分,将数字的每一位放入存储加数的数组中;
3. 在实现算法时,从最小的加数个位开始累加,循环次数是最大加数的数个数,将累加的结果放入结果数组中,计算进位;
4. 计算结果的最高位是否有进位;
5. 将结果转为字符串输出(因为是大数,基本数据类型可能存储不下);
示例:
1 用户输入加数 string numA = "123456789"; string numB = "2345689"; 2 构建三个数组(结果集一定要大于最大加数位数加1,并且初始化): int number1[500]={0},number2[500]={0}; int result[501]={0}; 3 将用户输入的numA,numB转化后放入到number1,number2中; for(i = 0,j = numA.length() - 1;j >= 0;i++,j--){ // 因为字符串中保存的是ascii码,因此需要减去48,48是数字0 number1[i] = numA[j] - 48; } 同理转化numB 4 循环累加结果并进位: // 首先计算哪个加数大 int maxLen = (numA.length() > numB.length()) ? numA.length() : numB.length(); // 保存需要进位的个数 int temp = 0; // 一定要是<=maxLen,否则最高位没法进位 for(i = 0;i <= maxLen;i++){ result[i] = number1[i] + number2[i] + temp; if(result[i] >= 10){ // 两个数相加最多进1 temp = 1; // 进位,模10取余数就得到个位还剩多少 result[i] = result[i] % 10; }else{ // 如果没有进位,需要置为0 temp = 0; } } 5 计算最高位是否需要进位 // 如果最高位的值为0,说明没有进位 if(0 == result[maxLen]) maxIndex = maxLen-1; else maxIndex = maxLen; 6 输出大数相加结果 // 一定要从最高位输出 for(i = maxIndex;i >= 0;i--){ cout << result[i]; }
通过以上的伪代码,相信你已经能够根据这个思想写出大数相加的算法了。
三、完整代码
代码我只贴出核心部分哦!int number1[500] = {0},number2[500] = {0}; int result[501] = {0}; int i = 0; int j = 0; for(i = 0,j = numA.length() - 1;j >= 0;i++,j--){ number1[i] = numA[j] - 48; } for(i = 0,j = numB.length() - 1;j >= 0;i++,j--){ number2[i] = numB[j] - 48; } int maxLen = (numA.length() > numB.length()) ? numA.length() : numB.length(); int temp = 0; for(i = 0;i <= maxLen;i++){ result[i] = number1[i] + number2[i] + temp; if(result[i] >= 10){ temp = 1; result[i] = result[i] % 10; }else{ temp = 0; } } if(0 == result[maxLen]){ maxIndex = maxLen - 1; }else{ maxIndex = maxLen; } for(i = maxIndex;i >= 0;i--){ cout << result[i]; }
由于小编能力有限,如有错误,欢迎指正!
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(所有根到叶子结点组组成的数字相加)】
- Java实现超大数字相加的算法
- (链表实现)写出两个一元多项式相加的算法
- Quicksum_算法实现按顺序相加计算字符
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- (链表实现)写出两个一元多项式相加的算法
- (链表实现)写出两个一元多项式相加的算法
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- 大数相加与相乘算法实现
- c语言实现长数字相加算法
- 一元多项式相加的算法和C++实现
- leetcode算法题:两数相加(Java实现-效率超过100%提交者)
- 超长正整数(超出long表数范围)的相加算法(Java实现)
- 稀疏矩阵的三元组表示的实现及应用(2)——采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
- 大数相加算法的实现
- C语言超大数相加求和、加减乘除算法实现
- 经典算法实现——字符串(一)