51Nod 1005 大数加法

两个超长带符号数字相加这道题,是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码格式进行计算)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值