大整數乘法 分治法

2021-10-12 09:53:38 字數 1084 閱讀 5773

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 ...