趋势科技算法岗笔试
题目
计算两个超大正实数的和,超大正实数以字符串形式存储
// 计算两个超大非负数字字符串的和
def LongAdd(s1, s2):
if len(s1) == 0 or len(s2) == 0:
return 'ValueError'
s1Left, s1Right = LeftRightLen(s1)
s2Left, s2Right = LeftRightLen(s2)
leftmax = max(s1Left, s2Left)
rightmax = max(s1Right, s2Right)
length = leftmax + rightmax + 1
s3 = []
car = 0
if s1Left < s2Left:
s1 = s1.rjust(len(s1) - s1Left + s2Left, '0')
else:
s2 = s2.rjust(len(s2) - s2Left + s1Left, '0')
if s1Right < s2Right:
s1 = s1.ljust(len(s1) - s1Right + s2Right, '0')
else:
s2 = s2.ljust(len(s2) - s2Right + s1Right, '0')
for i in range(len(s1) - 1, -1, -1):
if s1[i] != '.' and s2[i] != '.':
sum, car = add(s1[i], s2[i], car)
s3.append(str(sum))
else:
s3.append('.')
s3 .reverse()
s3 = ''.join(s3)
return s3
def LeftRightLen(s):
for j in range(len(s)):
an = j
if s[j] == '.':
return an, len(s) - an
return an+1, 0
def add(s1, s2, car):
sum = ord(s1) + ord(s2) - 2 * ord('0') + car
car = sum // 10
sum = sum % 10
return sum, car