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