看到 a+b 问题,大家都笑了。
今天我们讨论的,是超长的 a + 超长的 b;好吗!!!
题目:
a=999999999999999999999999999999999999999999999999999999999999999999
b=8888888888888888888888888888888888888888985666666
请您写一个程序,算出a+b的和;哈哈哈哈
不会了吧,不会不要紧,后面有详细的解答哦!
===========================================================================================
解题思路:
1、读入与存储:数据的位数太多,longlong 也装不下,只能用字符串来进行存储;
2、类型转换:字符串本身没有运算功能,为了方便运算,需要将字符串转换为整数数组;
3、数位对齐:将各位数字逆序存放,以第一位为个位,可以进行数位对齐;
4、模拟竖式计算:直接按照列竖式计算的过程,进行模拟运算:各位求和、进位;
5、反向逐位输出:因为数位对齐,从个位开始,所以要反向输出。
===========================================================================================
解题过程:
本次过程只讲原理,不要执着数位长度这些细节
1、读入+存储+逆序对齐:
1.1 用 s [ ] 数组来存储第一个字符串
1.2 将 s [ ] 数组的 字符串,逆序放入 a [ ] 数组中,以第一位作为个位,翻转对齐,方便运算;
1.3 重复利用 s [ ] 数组来存储第二个字符串
1.4 将 s [ ] 数组的 字符串,逆序放入 b [ ] 数组中,以第一位作为个位,翻转对齐,方便运算;
1.5 到这个时候,我们得到了 a [ ] ,b [ ] 两个数组,分别存储了两个将要计算的整数(其实是两个序列)
1.6 分别用变量 na,nb 来记录每个序列的长度(这个数有多少位),na=9,nb=8;
2、模拟竖式计算:
2.1 因为全部数字是翻转的,所以个位在左边,最高位在右边:
2.2 对 a [ ] ,b [ ] 的各数位分别求和,存储到 c [ ] 数组中:
2.3 对 c [ ] 数组:从左向右,依次进位,最高位溢出的话,继续进位,
2.4 得到新的 c [ ] 数组,数组长度nc=10 :
3、反向逐位输出:
3.1 因为数位对齐,从个位开始,所以要反向输出。
===========================================================================================
思路看懂了吗?别着急,还有很多细节处理要学习,下面是代码和解释