python高精度加算を実現

2403 ワード

従来から使用するc+,c++は高精度の計算方式を提供していないため、大きな整数の演算はすべて手動で実現する必要があり、pythonはすでに私たちに高精度の演算を提供してくれた.ここではpythonを練習として勉強したばかりで、コードが高精度の加算演算を実現する原理からである.高精度加算の過程は列縦計算を完全にシミュレートする方式であり,2つのリストを開き,加算a,a=1243,リストに[1,2,4,3]、加算b,b=12,リストに[1,2]と保存すると,2つのリストの長さが異なり,後のコード実装が不便になるため,計算を実行する前に2つのリストを[1,2]と処理する.
[0, 1, 2, 4, 3]
[0, 0, 0, 1, 2]

2つの数の長さが一致していても、短いものは左に0を補い、最後に2つの数の左端に1つの0を追加する.これは、最高位のキャリー後にキャリーの値が格納されないことを防止するためである.我々は右から左に計算し、計算した各ビット数をリストaに保存し、上の2つの数を加算すると2+3=5でa[4]に余剰を求め、a[3]に整数を加算してキャリーを処理し、4+1=5余剰を求めてa[3]に保存し、整頓してa[2]に加算し、順次類推し、2数の和が10より大きいと進位1があり、そうでなければ進位0であり、進位がないことに相当する
コード実装を参照してください.
from functools import reduce#  reduce                 
def add(a, b):
    if len(a) > len(b):#                
        b = b.zfill(len(a) - len(b) + 1)
    else:
        a = a.zfill(len(b) - len(a) + 1)
    #("0" + str(a))   "0"                     
    #   9+9       ,         0    1      
    a = list(map(lambda x : int(x), ("0" + str(a)).strip()))
    b = list(map(lambda x : int(x), ("0" + str(b)).strip()))

    for i in range(len(a) - 1, 0, -1):
        temp = a[i] + b[i];
        a[i - 1] += temp // 10
        a[i] = temp % 10
    return int(reduce(lambda x, y : str(x) + str(y), a))#      

a, b = input("input a: "), input("input b: ")
print(add(a, b))