大整數乘法

2021-10-12 01:41:36 字數 1317 閱讀 1720

import sys

s = sys.stdin.readline().strip().split()

def karatsuba_mul(num1, num2):

# karatsuba演算法

if len(str(num1)) == 1 or len(str(num2)) == 1:

return num1 * num2

n = max(len(str(num1)), len(str(num2)))

half = n // 2

a = num1 // 10 ** half

b = num1 % 10 ** half

c = num2 // 10 ** half

d = num2 % 10 ** half

ac = karatsuba_mul(a, c) # 計算a*c

bd = karatsuba_mul(b, d) # 計算b*d

abcd = karatsuba_mul(a + b, c + d) # 計算(a+b)*(c+d)

adbc = abcd - ac - bd

return ac * 10 ** (2 * half) + adbc * 10 ** half + bd

print(str(karatsuba_mul(int(s[0]), int(s[1]))))

k_multi()

//遞迴呼叫k_multi來對num1和num2實現乘法

//輸入:兩個數字:num1 ,num2

//輸出:兩數相乘結果

if (num1<10)or (num2<10)

return num1*num2

length = max(len(num1),len(num2))

half = length/2

a,b = num1 / 10 ** half,num1 % 10 ** half

c,d = num2 / 10 ** half,num2 % 10 ** half

//遞迴計算

ac = k_multi(a,c)

bd = k_multi(b,d)

abcd = k_multi(a+b,c+d)

adbc = abcd - ac - bd

return ac*10**half + adbc*10**half + bd

演算法時間複雜度t(n) = 3t(n/2) + f(n)

其中加法運算f(n)的時間複雜度可以看為cn

由主定理得:t(n) ∈ θ(nlog23)

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...

大整數乘法

問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...

大整數乘法。

include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...