兩個超長帶符號數字相加這道題,是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=10:
if j==len(alist)-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 (jlength2:
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碼格式進行計算)
51Nod 1005 大數加法
今天遇見一道細節問題特別多的題,寫得我眼疼,題本身不難,難得是他的細節問題繁多,需要考慮的情況也甚多,稍有不慎就側漏了,哈哈。題的思路也很清晰,就是將最後的結果的正負的符號分離出來,剩下的就是高精度的加減法了,利用字串處理即可,效率可以很高很高,有多高呢?自己感覺吧!題 給出2個大整數a,b,計算a...
51nod 1005 大數加法
給出2個大整數a,b,計算a b的結果。input 第1行 大數a 第2行 大數b a,b的長度 10000 需注意 a b有可能為負數 output 輸出a binput示例 68932147586 468711654886output示例 537643802472純粹的模擬,主要分一下幾種情況 ...
51nod 1005 大數加法
1005 大數加法 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出2個大整數a,b,計算a b的結果。input 第1行 大數a 第2行 大數b a,b的長度 10000 需注意 a b有可能為負數 output 輸出a binput示例 68932147586 4...