我要解决的问题是求两个大数字的和,其中的数字以字符串形式给出。 算法是:
这就是我尝试的代码:
def stringadd(s1, s2):
s1 = s1[::-1]
s2 = s2[::-1]
m = len(s1)
n = len(s2)
carry = 0
s = ""
if len(s1) > len(s2):
temp = s2
s2 = s1
s1 = temp
for i in range(m):
su, = (ord(s1[i]) - 48) + (ord(s2[i]) - 48) + carry
s += chr(sum % 10 + 48)
carry = int(sum / 10)
for i in range(m, n):
sum = (ord(s2[i]) - 48) + carry
s += chr(sum % 10 + 48)
carry = int(sum / 10)
i += 1
if carry:
s += chr(carry + 48)
s = s[::-1]
return s
print(stringadd("32134", "23456782"))
我在第17行得到一个字符串索引超出范围错误,这是
sum = (ord(s1[i]) - 48) + (ord(s2[i]) - 48) + carry
我试着运行代码,当我以
print(stringadd("32134","23456782"))
的形式发送输入时,我确实得到了正确的答案,但是当我将其更改为print(stringadd("23456782", "32134"))
时,我遇到了错误。这是因为您正在使用m
和n
进行循环,但在某些情况下(当len(s1)>len(s2)
)您正在交换s1
和s2
您应该在交换之后取
s1
和s2
的值。这将修复代码。请在下面找到正确的代码您还可以改变以下几个方面:
sum
作为变量,因为它是保留关键字李>i += 1
,因为它在forloop中没有任何作用李>希望这能回答你的问题
有几件事:
m
和n
的长度,因此它们不一定再匹配李>i+=1
,它什么都不做sum
作为变量名,隐藏内置的sum函数李>我建议改写如下:
其中一些优势:
len(shorter)
或len(longer)
而不是n
和m
来明确其含义您甚至可以用
ord("0")
替换神奇常数48
,以更清楚地说明该数字的作用。为了好玩,我们还可以使用更实用的风格:相关问题 更多 >
编程相关推荐