大数是指超过计算机所能表示范围的数,处理大数需要使用适当的数据结构和算法设计
1.1 大数怎么存储
字符串、数组
1.2 大数计算怎么实现
手动模拟,小学算术一样计算
1.3 代码实现
正数加减法
def subtract_abs(num1, num2):
"""
计算|num1 - num2|
:param num1: 正数数组
:param num2: 正数数组
:return: |num1 - num2|的字符串表示
"""
n1 = len(num1)
n2 = len(num2)
# 位数不够补0
if n1 < n2:
num1 = [0] * (n2 - n1) + num1
num1, num2 = num2, num1
n = n2
else:
num2 = [0] * (n1 - n2) + num2
n = n1
ans = [0] * n
borrow = 0 # 初始化借位为0
# 模拟手动减法,逆序计算
for i in range(n - 1, -1, -1):
diff = num1[i] - num2[i] - borrow
if diff < 0:
diff += 10
borrow = 1
else:
borrow = 0
ans[i] = diff
return ''.join(map(str, ans)).lstrip('0')
def subtract_big_numbers(num1, num2):
"""
计算num1 - num2
:param num1: 正数数组
:param num2: 正数数组
:return: num1 - num2,字符串
"""
n1 = len(num1)
n2 = len(num2)
res = subtract_abs(num1, num2)
return '-' + res if n1 < n2 else res
def add_big_numbers(num1, num2):
"""
计算num1 + num2
:param num1: 正数数组
:param num2: 正数数组
:return: num1 + num2,字符串
"""
n1 = len(num1)
n2 = len(num2)
# 有可能进位
n = max(n1, n2) + 1
res = [0] * (n)
carry = 0 # 初始化进位为0
num1 = [0] * (n - n1) + num1
num2 = [0] * (n - n2) + num2
for i in range(n - 1, -1, -1):
t = num1[i] + num2[i] + carry
res[i] = t % 10
carry = t // 10
return ''.join(map(str, res)).lstrip('0')
num1 = [9, 8, 7, 6, 5] # 表示数字98765
num2 = [5, 4, 3, 2, 1]
print(subtract_big_numbers(num1, num2)) # 输出: 44444
num1 = [9, 9, 9]
num2 = [1, 0, 0, 0, 0]
print(subtract_big_numbers(num1, num2)) # -9001
num2 = [1, 9, 9, 9]
num1 = [9, 9, 9]
print(add_big_numbers(num1, num2))