分治遞迴 大整數乘法

2021-09-02 07:15:44 字數 1702 閱讀 3604

設x,y十進位制整數,計算乘積xy。

用小學方法設計演算法,計算步驟太多,而且效率低。t(n)=o(n^2)

所以用分治方法設計更有效的大整數乘法。將n為十進位制整數x,y分為兩段,每段長為n/2(若位數為奇數,每段長為[n/2],[n/2]+1)。x分為a和b,y分為c和d.比如 8945456 ,即a=89,b=45,c=4,d=56.

引入公式:

xy=ac(n^2 +((a-b)(d-c)+ac+bd)*2^(n/2)+bd

看起來似乎更複雜,其實只需要做三次n/2為整數的乘法。t(n)=o(n^log3)

1.函式庫引入,預編譯。

#include#include
2.因為要對非2^n求解,所以引入整數字數,若為奇數,則分為不相等位數的兩個數字。若想等,則直接分為位數相等的兩個整數。

int place(x)   //求x是多少位數(10位數以內)

return n;

}

3.位數求解後,直接使用公式求解。

int bignum(int x,int y)

}

4.完成函式呼叫,求解乘積。

void main()

5.執行結果

注:因為c語言本身程式計算位數有限,會產生資料溢位。所以以下結果也是正常的。但在python環境下就可無限計算。

將**轉成python

def place(x):   #求x是多少位數(10位數以內)

n=0;

while x>0:

n=n+1

x=int(x/10)

return n

def bignum(x,y):

#int n,m,a,b,c,d,p1,p2,p3;

if(place(x)<=2 or place(y)<=2):

return x*y

else:

n=int(place(x)/2)

m=int(place(y)/2)

a=int(x/pow(10,n))

b=x-a*pow(10,n) #a是x前半部分,b是x後半部分

c=int(y/pow(10,m))

d=y-c*pow(10,m) #c是y前半部分,d是y後半部分

p1=bignum(a,c) #遞迴運算ac,bd,(a-b)(d-c)

p2=bignum(b,d)

p3=bignum(a-b,d-c)

return p1*pow(10,2*n)+(p3+p1+p2)*pow(10,n)+p2

x=int(input("x="))

y=int(input("y="))

print(bignum(x,y))

執行結果

分治 大整數乘法

第一次自己完整寫對,多多指教 演算法思路 分治。第一步 經過預處理將兩個整數變為長度一樣的兩個數 短的在前面補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 ...

分治演算法 大整數乘法

用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。分析 用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。演算法描述 兩個十進位制的數 x y x a 10 n1 b y c 10 n2 d 則 x y a 10 n1 b c 10 n2 d 設乙個陣列,將其看做10000 進製...