ZOJ--1205
这道题算是大数相加吧,不过是带字母的20进制数,若是纯粹的大数对于Python来说毫无压力,因为Python的长整形所能表示的范围仅与机器的内存大小有关。这道题目中字母部分要转换成数字才能运算,我用一个trans()函数将输入中的字母转换成相应的数字储存在列表中,再用add()函数执行相加的操作,两数相加一开始不用考虑进位的事情,先将他们对应相加,然后再统一执行进位的操作,满20则进1。部分说明在注释中,下面是代码:
<span style="font-family:SimSun;font-size:14px;">#2015-02-16
# -*- coding: utf-8 -*-
import sys
def trans(p):
'转换函数'
l = []
for m in range(len(p)):
if ord(p[m]) < ord('a'):
l.append(int(p[m]))
else:
temp = ord(p[m]) - ord('a') + 10 #将字母部分转换成数字
l.append(temp)
return l
def add(p,q):
'相加函数'
x = trans(p)
y = trans(q)
if len(x)>len(y):
length = len(x)
else:
length = len(y)
for i in range(length): #对应相加
if i<len(x) and i <len(y):
z.insert(0,x[len(x)-i-1]+y[len(y)-i-1])
elif i <len(x):
z.insert(0,x[len(x)-i-1])
elif i <len(y):
z.insert(0,y[len(y)-i-1])
for i in range(len(z)-1,0,-1): #满20进1
if z[i] > 19:
z[i-1] += z[i]/20
z[i] = z[i]%20
while z[0] > 19:
z.insert(0, z[0]/20)
z[1] = z[1]%20
if __name__ == '__main__':
output = [0,1,2,3,4,5,6,7,8,9,'a','b','c'
,'d','e','f','g','h','i','j'] #列表若太长是可以分行的
while True:
try:
z = []
p = raw_input()
q = raw_input()
add(p,q)
for i in z:
print output[i],
sys.stdout.softspace = 0
print '\n',
sys.stdout.softspace = 0
except EOFError:
exit(0)
break</span>