1. 程式人生 > 實用技巧 >藍橋杯-Python-高精度加法

藍橋杯-Python-高精度加法

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於騰訊雲,作者:演算法與程式設計之美。

問題描述

輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。

演算法描述

由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。
定義一個數組A,A[0]用於儲存a的個位,A[1]用於儲存a的十位,依此類推。同樣可以用一個數組B來儲存b。
計算c = a + b的時候,首先將A[0]與B[0]相加,如果有進位產生,則把進位(即和的十位數)存入r,把和的個位數存入C[0],即C[0]等於(A[0]+B[0])%10。然後計算A[1]與B[1]相加,這時還應將低位進上來的值r也加起來,即C[1]應該是A[1]、B[1]和r三個數的和.如果又有進位產生,則仍可將新的進位存入到r中,和的個位存到C[1]中。依此類推,即可求出C的所有位。
最後將C輸出即可。

輸入格式

輸入包括兩行,第一行為一個非負整數a,第二行為一個非負整數b。兩個整數都不超過100位,兩數的最高位都不是0。

輸出格式

輸出一行,表示a + b的值。

樣例輸入

20100122201001221234567890
2010012220100122

樣例輸出

20100122203011233454668012

解決方案

根據題中的演算法描述可以大致的清楚做題步驟。

(1)既然題目中說了不能用標準的資料型別來儲存數字,所以在寫輸入的程式碼時就需要注意,不能直接a = int(input),而是直接在輸入的時候就將資料轉化為列表。就像這樣A = list(input)

(2)輸入寫好了過後,再看題目,要求兩個數的每一位相加,就像筆算一樣,所以就需要遍歷兩個陣列的每一位數,如果採用兩個for的形式的話,會出現很多重複的情況,而且時間複雜度也為Tn=O(n*n)。自然是很麻煩的,所以就需要用到python的內建函式zip(),這樣就可以直接同時遍歷兩個陣列。然後再根據演算法描述的做法,將加得的數十位個位分別儲存。

(3)寫好以上步驟後會發現zip()函式只會遍歷到其中最短的一個數組結束後就停止了。也就是說只有兩個數字相同位數時才可行。這時就需要在遍歷前對兩個陣列處理一下,將短的陣列用0來填充至一樣長。這樣就可以在不改變原數大小的情況下使zip()函式能遍歷完整了。

根據以上步驟,即可將此題解決。

程式碼示例:

A = list(input())

B = list(input())

l = abs(len(A)-len(B))

for i in range(l):

    if len(A)>len(B):

        B.insert(0,0)

    else:

        A.insert(0,0)

C 
= [] r = 0 for x,y in zip(A[::-1],B[::-1]): ss = int(x)+int(y)+r if ss>=10: r = ss//10 else: r = 0 C.insert(0,str(ss%10)) C.insert(0,str(r)) print(int(''.join(C)))

結語

有時在處理問題的時候,容易將問題複雜化,這時就不妨需要換另一種思維看看,也許就能眼前一亮。

END