51Nod 1005 大数加法

来源:互联网 发布:c语言怎么实现多线程 编辑:程序博客网 时间:2024/06/07 07:26

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

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

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

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

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

5.int和str的类型转换

#coding:utf-8def rev(a):     if a[0]=='-':        flag='-'        return a[1:],flag    else:        flag=''        return a,flagdef 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 cdef 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 cdef markcompare(a,b): #比较a,b的符号值    if a==b: return True    else: return Falsedef 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 1def 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码格式进行计算)



0 0
原创粉丝点击