layout: posttitle: 数据结构与算法—大整数相加
date: 2019-10-18
tag: 数据结构与算法

大整数相加

给两个很大很大的整数(可能有几百位),求出他们的和

  • 思路

因为很大的数已经超过了计算机可以存储,虽然 Python3 中的整型是没有限制内存大小的,但是不代表其他语言没有内存限制,所以一般将两个整数直接相加并不现实

在 Python3 中,一个长度为 36 的整数占 48 字节,一个长度为 1 的数占的字节数 28 字节,整数长度长和短在内存中差别并不明显。

实例2_实现大整数相加 - 图1

实例2_实现大整数相加 - 图2

既然没办法直接进行相加,想想小学的时候,老师是怎么教我们的,是不是从个位相加,超过 10 就进位。那么这么大的数字该用什么存储呢?有两种方法,一种是用数组存储,一种是用字符串存储

实例2_实现大整数相加 - 图3

  • 代码

边界条件与测试案例

  1. 边界条件:输入非数值
  2. 正常大的整数
  3. 小的数值(0 )与大的数值
  1. def big_num_sum(num1: str, num2: str) -> str:
  2. """
  3. 边界条件:输入非数值
  4. 测试案例:
  5. 1. 包含有非数值的字符串
  6. 2. 正常大的整数
  7. """
  8. assert num1.isdigit() == True
  9. assert num2.isdigit() == True
  10. long_num, short_num = (num1, num2) if (len(num1) > len(num2)) else (num2, num1) # c
  11. long_num = long_num[::-1] # 倒序
  12. short_num = short_num[::-1]
  13. long_len = len(long_num) # 字符的长度
  14. short_len = len(short_num)
  15. for i in range(long_len - short_len): # 将较短的数值后面补 0 补到和较长的数一样的长度
  16. short_num += "0"
  17. result = "" # 用来保存结果
  18. flag = 0 # 进位标志位
  19. for i in range(long_len):
  20. temp = int(long_num[i]) + int(short_num[i]) + flag
  21. if temp >= 10:
  22. result += str(temp-10)
  23. flag = 1 #
  24. else:
  25. result += str(temp)
  26. flag = 0
  27. return int(result[::-1])
  28. if __name__ == "__main__":
  29. assert (big_num_sum("1234533333133333336", "88888888888888") == 1234533333133333336+88888888888888) == True
  30. assert (big_num_sum("0", "1") == 0+1) == True
  31. assert (big_num_sum("0", "d")) # 非数值输入会报错,用来测试边界条件

当然,这个程序还可以换成用数组的形式写,这里就不在给出,同时还可对以上代码进行优化,如:只需要遍历最短的那个即可,这样对于很大整数加上一个小的整数来说,效率会更高,占据的内存也会更小

本代码的时间复杂度是 O(n)