对于20位以上的超长整数无法用int、long等基本类型表示,但可以考虑用字符串实现。 本关任务:编写程序,基于字符串实现对超长整数的加法运算和减法运算,输入两个超长整数和运算符(+或-),输出运算结果。 例如:输入123456789012345678901 + 123,输出123456789012345679024。 要求:输入的两个超长整数都是非负整数,并且长度都小于100位。对于减法运算,如果运算结果为负数要在前面加上负号。并且运算结果要去掉前导0,例如运算结果如果是000123,要变成123输出。 提示 对于加法,考虑先把两个数对齐,再按位加(要考虑进位),运算结果以字符串形式输出。 对于减法,先比较被减数和减数的大小,如果被减数小于减数,则需要交换被减数和减数,然后再按位减(要考虑借位)。
时间: 2024-03-14 08:47:51 浏览: 72
好的,那我们先来看看加法的实现。
加法的实现思路如下:
1. 将两个字符串逆序,方便从低位开始计算。
2. 将两个字符串用 0 补齐,使它们的长度相等。
3. 从低位开始,将两个字符串对应位相加,考虑进位,将结果存到一个新的字符串中。
4. 如果最高位有进位,则将进位也加上。
5. 将新字符串逆序,删除前导 0,输出结果。
下面是对应的 Python 代码实现:
```python
def add(num1, num2):
# 将两个字符串逆序
num1, num2 = num1[::-1], num2[::-1]
# 用 0 补齐,使它们的长度相等
if len(num1) < len(num2):
num1 += '0' * (len(num2) - len(num1))
else:
num2 += '0' * (len(num1) - len(num2))
# 从低位开始,将两个字符串对应位相加,考虑进位,将结果存到一个新的字符串中
carry = 0
result = ''
for i in range(len(num1)):
s = int(num1[i]) + int(num2[i]) + carry
carry = s // 10
result += str(s % 10)
# 如果最高位有进位,则将进位也加上
if carry > 0:
result += str(carry)
# 将新字符串逆序,删除前导 0,输出结果
return result[::-1].lstrip('0') or '0'
```
接下来我们来看看减法的实现。
减法的实现思路如下:
1. 比较被减数和减数的大小,如果被减数小于减数,则需要交换被减数和减数,并在结果前面加上负号。
2. 将两个字符串逆序,方便从低位开始计算。
3. 将两个字符串用 0 补齐,使它们的长度相等。
4. 从低位开始,将两个字符串对应位相减,考虑借位,将结果存到一个新的字符串中。
5. 如果最高位有借位,则将借位也减去。
6. 将新字符串逆序,删除前导 0,输出结果。
下面是对应的 Python 代码实现:
```python
def subtract(num1, num2):
# 比较被减数和减数的大小
if int(num1) < int(num2):
num1, num2 = num2, num1
negative = True
else:
negative = False
# 将两个字符串逆序
num1, num2 = num1[::-1], num2[::-1]
# 用 0 补齐,使它们的长度相等
num2 += '0' * (len(num1) - len(num2))
# 从低位开始,将两个字符串对应位相减,考虑借位,将结果存到一个新的字符串中
borrow = 0
result = ''
for i in range(len(num1)):
s = int(num1[i]) - int(num2[i]) - borrow
if s < 0:
s += 10
borrow = 1
else:
borrow = 0
result += str(s)
# 如果最高位有借位,则将借位也减去
if borrow > 0:
result = str(int(result) - 10**len(num1) + 10) # 注意这里的处理方式
# 将新字符串逆序,删除前导 0,输出结果
result = result[::-1].lstrip('0') or '0'
if negative:
result = '-' + result
return result
```
希望这些代码能够帮到你!
阅读全文