您的位置:首页 > 编程语言 > Python开发

51Nod 1005 大数加法

2017-04-22 10:47 369 查看
两个超长带符号数字相加这道题,是51Nod的第一题。虽然简单,其关键在于完整的考虑各种边界情况:

1.加法进位后可能会造成多出一位的情况;

2.减法借位后可能导致前N个值都为0,需要剔除;

3.由于按位加减法时是将数字反序进行排列的,剔除0时需要(反序的反序)来进行。

4.range的起始和结束字符需要慎重考虑

5.int和str的类型转换

#coding:utf-8

def rev(a):
if a[0]=='-':
flag='-'
return a[1:],flag
else:
flag=''
return a,flag

def bigadd_sub(a,b): #大数加法
alist = list(a[::-1])
blist = list(b[::-1])
for j in range(0,len(alist)):
if (j<len(blist)):
alist[j] = int(alist[j]) + int(blist[j])
if int(alist[j])>=10:
if j==len(alist)-1:
alist.append(1)
else:alist[j+1] =int(alist[j+1])+1
alist[j] = alist[j] - 10
c=''.join(str(s) for s in alist)
return c

def bigsubstract_sub(a,b): #大数减法
alist = list(a[::-1])
blist = list(b[::-1])
for j in range(0,len(alist)):
if (j<len(blist)):
alist[j] = int(alist[j]) - int(blist[j])
if int(alist[j])<0:
alist[j+1] =int(alist[j+1])-1
alist[j] = alist[j] + 10
for j in range(len(a)-1,-1,-1): #range的有效范围形如[0,1)
if alist[j]==0:alist.pop()
else:break
c=''.join(str(s) for s in alist)
return c

def markcompare(a,b): #比较a,b的符号值
if a==b: return True
else: return False

def comparebig(a,b): #比较两个绝对数的大小
length1 = len(a)
length2 = len(b)
if length1>length2:
return 1;
elif length2>length1:
return 2;
else:
for i in range(0,length1):
if a[i]>b[i]:
return 1;
elif b[i]>a[i]:
return 2
else:
continue
return 1

def bigadd(num1,num2): #真实调用的主体函数。
revnum1, flag1 = rev(num1)
revnum2, flag2 = rev(num2)
tag = comparebig(revnum1, revnum2)
marktag=markcompare(flag1, flag2)
if (marktag==True and tag==1):
sumtemp=bigadd_sub(revnum1,revnum2)
return flag1+sumtemp[::-1]
elif (marktag==True and tag==2):
sumtemp=bigadd_sub(revnum2,revnum1)
return flag2+sumtemp[::-1]
elif (marktag==False and tag==1):
sumtemp=bigsubstract_sub(revnum1,revnum2)
return flag1+sumtemp[::-1]
else:
sumtemp = bigsubstract_sub(revnum2, revnum1)
return flag2 + sumtemp[::-1]

num1 = input()
num2 = input()

ans=bigadd(num1,num2)
print(ans)

说明:类型转换需要大量的时间。如果进一步优化时间,则应当考虑使用纯字符串格式进行计算(即利用0-9的ascii码格式进行计算)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 51nod