import sys
def add(n1, n2): #字串加法
n1 = n1[::-1]
n2 = n2[::-1]
# 補齊到和的最大位數(相加後可能在最後進一位,所以末尾補乙個0)
if len(n1)1 and sum[0]=='0':
sum = sum[1:]
return sum
def muti(x1, x2):
# xi = ['123435',5]分別表示分解後的乘數,後面補0的數量 (12343500000)
len1,len2 = len(x1[0]),len(x2[0])
if len1 > 10:
cut_point = len1//2
x1_0 = [x1[0][:cut_point],x1[1]+len1-cut_point]
x1_1 = [x1[0][cut_point:],x1[1]]
return add(muti(x1_0, x2),muti(x1_1,x2))
if len2 > 10:
cut_point = len2//2
x2_0 = [x2[0][:cut_point],x2[1]+len2-cut_point]
x2_1 = [x2[0][cut_point:],x2[1]]
return add(muti(x1, x2_0),muti(x1,x2_1))
val = str(int(x1[0])*int(x2[0]))
bit = x1[1]+x2[1]
val += '0'*bit
return val
if __name__ == "__main__":
for line in sys.stdin:
n1,n2 = line.split()
print(muti([n1,0], [n2,0]))
舉例說明
分治法計算大整數乘法
最近在學習演算法課程,自己寫了一點計算大整數乘法 正數 的 如果有不對的地方希望能請大家指點一下我,謝謝!片.include pch.h include include include using namespace std 通過鍵盤輸入獲取要計算的大整數 void input string str...
分治 大整數乘法
第一次自己完整寫對,多多指教 演算法思路 分治。第一步 經過預處理將兩個整數變為長度一樣的兩個數 短的在前面補0 第二部 把兩個大整數都平分為前後兩部分 第三部 按以下公式計算 實現大數乘法之前實現了大數加減法 公式 x a 10 n 2 b y c 10 n 2 d xy ac 10 n a b ...
分治 大整數乘法
問題描述 設x和y是兩個n位的二進位制整數,現在要計算它們的乘積xy,傳統方法計算每2個1位數乘法或加法都看作一步運算,這樣需要o n2 次位運算,代價太高,現在運用分治法設計乙個更有效的大整數乘法演算法。當n 1時,計算x y就是一次位乘。現在對x y進行劃分,把x和y各分為兩段,每段長為n 2 ...