📅  最后修改于: 2023-12-03 15:28:48.212000             🧑  作者: Mango
门|门 IT 2006 |第 31 题是一道经典的计算题,要求实现一个简单的计算器,支持加法、减法、乘法和除法操作,并能够处理大整数。
实现一个函数,输入两个大整数和运算符,输出运算结果。
函数接口如下:
def big_integer_calculator(num1: str, num2: str, operator: str) -> str:
pass
num1
:字符串类型的数字1,其长度不超过 2^31-1 位。num2
:字符串类型的数字2,其长度不超过 2^31-1 位。operator
:字符串类型的运算符,取值范围为 '+', '-', '*', '/'。def big_integer_calculator(num1: str, num2: str, operator: str) -> str:
# 转换输入
a, b = [int(x) for x in num1], [int(x) for x in num2]
# 反转两个整数列表,这样从低位开始运算
a.reverse()
b.reverse()
# 初始化结果
ans = []
# 如果是加法
if operator == '+':
carry = 0
for i in range(max(len(a), len(b))):
tmp = carry + (a[i] if i < len(a) else 0) + (b[i] if i < len(b) else 0)
ans.append(tmp % 10)
carry = tmp // 10
if carry:
ans.append(carry)
# 如果是减法
elif operator == '-':
borrow = 0
for i in range(max(len(a), len(b))):
tmp = (a[i] if i < len(a) else 0) - (b[i] if i < len(b) else 0) - borrow
if tmp < 0:
tmp += 10
borrow = 1
else:
borrow = 0
ans.append(tmp)
while len(ans) > 1 and ans[-1] == 0:
ans.pop()
# 如果是乘法
elif operator == '*':
for i in range(len(a)):
carry = 0
for j in range(len(b)):
tmp = carry + ans[i+j] + a[i]*b[j]
ans[i+j] = tmp % 10
carry = tmp // 10
if carry:
ans[i+len(b)] += carry
while len(ans) > 1 and ans[-1] == 0:
ans.pop()
# 如果是除法
elif operator == '/':
if len(b) == 1 and b[0] == 0:
return "Error"
# 计算a // b
r = 0
for i in range(len(a)-1, -1, -1):
r = r*10 + a[i]
ans.append(r // b[0])
r %= b[0]
ans.reverse()
while len(ans) > 1 and ans[-1] == 0:
ans.pop()
# 将结果转换成字符串并返回
return "".join([str(x) for x in ans[::-1]])
上述代码实现了加、减、乘、除四种运算,其中加法和除法比较简单,而减法和乘法需要考虑进位和借位的问题。其中,乘法的时间复杂度为 O(len(num1)*len(num2)),相对较慢。如果需要更快速的实现,可以使用 Karatsuba 算法。