对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输
时间: 2023-07-20 18:36:17 浏览: 157
C++中超长数类型的构造与实现
好的,我来为您提供一个基于字符串的超长整数加减法的实现代码,您可以参考一下:
```python
def removeLeadingZeros(s):
# 去掉字符串前导0
while len(s) > 1 and s[0] == '0':
s = s[1:]
return s
def add(s1, s2):
# 将两个字符串补齐,使其长度相等
n1, n2 = len(s1), len(s2)
if n1 > n2:
s2 = '0' * (n1 - n2) + s2
else:
s1 = '0' * (n2 - n1) + s1
# 从低位到高位逐位相加,并处理进位
res, carry = '', 0
for i in range(len(s1)-1, -1, -1):
tmp = int(s1[i]) + int(s2[i]) + carry
res += str(tmp % 10)
carry = tmp // 10
if carry:
res += str(carry)
# 将结果翻转并去掉前导0
res = removeLeadingZeros(res[::-1])
return res
def subtract(s1, s2):
# 将两个字符串补齐,使其长度相等
n1, n2 = len(s1), len(s2)
if n1 > n2:
s2 = '0' * (n1 - n2) + s2
else:
s1 = '0' * (n2 - n1) + s1
# 判断s1是否小于s2,如果是则交换两个字符串
if s1 < s2:
s1, s2 = s2, s1
sign = '-'
else:
sign = ''
# 从低位到高位逐位相减,并处理借位
res, borrow = '', 0
for i in range(len(s1)-1, -1, -1):
tmp = int(s1[i]) - int(s2[i]) - borrow
if tmp < 0:
tmp += 10
borrow = 1
else:
borrow = 0
res += str(tmp)
# 将结果翻转并去掉前导0
res = removeLeadingZeros(res[::-1])
return sign + res if res else '0'
def longIntCalc(s1, s2, op):
# 根据运算符选择进行加法或减法运算
if op == '+':
return add(s1, s2)
elif op == '-':
return subtract(s1, s2)
else:
return 'Invalid operator'
# 测试样例
s1 = '123456789012345678901'
s2 = '123'
op = '+'
print(longIntCalc(s1, s2, op)) # 123456789012345679024
s1 = '123456789012345678901'
s2 = '123'
op = '-'
print(longIntCalc(s1, s2, op)) # 123456789012345678778
```
代码中定义了三个函数:`removeLeadingZeros`用于去掉字符串前导0,`add`用于实现超长整数的加法,`subtract`用于实现超长整数的减法。最后定义了一个`longIntCalc`函数,根据输入的运算符选择进行加法或减法运算。
需要注意的是,在减法运算中,需要判断被减数是否小于减数,如果是则交换两个字符串,并在最终结果前加上负号。此外,如果运算结果为0,则需要输出字符串'0'而不是空字符串。
阅读全文