大整數乘法
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)
相關文章
- 高精度整數的乘法
- 大數加法乘法
- 遞迴與分治之大整數乘法遞迴
- 大數運算—大數加法、減法、乘法、除法詳解
- 大整數加法
- 1051 複數乘法
- java大整數四則運算Java
- 漫畫:如何實現大整數相加?
- PAT-B 1051 複數乘法
- C++ 大整數類(BigInteger類)實現C++
- 整數排序排序
- 整數環
- 整數冪
- 整數拆分
- torch中向量、矩陣乘法大總結矩陣
- L1-080 乘法口訣數列
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- L1-080 乘法口訣數列 分數 20
- 輸入一個整數,返回這個整數的位數
- 數數的位數(正整數)
- 2034 整數的個數
- python整數和變數Python變數
- js小數轉整數JS
- 數值的整數次方
- 整數溢位
- 求正整數
- 整數小拼接
- 翻轉整數
- 反轉整數
- 羅馬數字轉整數
- 整數二分
- 整數取模類
- 整數反轉(ReverseInteger)
- 四位整數位數拆分
- 整數劃分為多數之和
- PHP取整,四捨五入取整、向上取整、向下取整、小數擷取PHP
- 有一組整數資料,全部除以一個整數a,使得餘數是同n種數字,如何計算出這個整數a的全部可能。
- 矩陣乘法矩陣