分治法 大整數相乘

2021-08-21 14:52:52 字數 1459 閱讀 5289

大整數相乘:a、b兩個整數,a有n位(123456……n),b有m位(123456……m),一般的思路是像最初學習乘法時一樣逐位相乘後相加,但是這樣做演算法的複雜度過高,但這仍然是解題的基本思想。

既然提到分治,那麼如何分,怎麼治?

能夠找到乙個大問題劃分為小問題方法的重要技巧是能夠看到大問題的規模和所謂規模的單位。在大整數相乘中大問題的規模就是乙個n位的整數要乘以乙個m位的整數,所謂規模的單位就是「位」。而「分」的目的就是把大規模拆分為小規模,把小單位轉變為大單位,這兩句是乙個意思,也就是說我們可以把規模n變成n/2和n/2(把以1位為單位規模為n的問題 變成 以n/2為單位的規模為2的問題),把規模m變成m/2和m/2(把以1位為單位規模為m的問題 變成 以m/2為單位的規模為2的問題),如此,原來的大整數相乘就變成了兩個2位數相乘,只不過低位向高位的進製不再是10,而是

則a分為n1位的a1和n2位,b分為m1位的b1和m2位的b2,如下式所示:

以此類推,我們可以把a1、a2、b1、b2繼續劃分,直至最小單位。(這裡在程式設計時需要用遞迴來實現)

上面講的很清楚了,那麼a和b的相乘就可以表示為:

現在是要計算四個大整數相乘,我們可以通過變換使得上式變成三個大整數相乘,如下式:(從上式到下式的思路沒想到,可能是缺乏經驗吧,待大神指點。)

*上述講解純屬個人見解,歡迎提出問題。

c++實現**:

下面實現的是輸入兩個大數,a和b,輸出axb的解。

#include

#include

#include

using namespace std;

string multi(string a, string b); //計算大整數相乘

string plus(string q, string w, string e, string r); //計算大整數相加

stringstream ss;

int main()

return 0;

}string multi(string a, string b)

else

else

return ab1 + ab2;}}

else

else

}else }}

string plus(string q, string w, string e, string r)

else

}return out;

}

大整數相乘 分治法(JS)

相乘的基本原理 如 1234 567第一步 分解 234 12 和 34 567 5 和 67 第二步 分別計算 首部 12 5 60 中部 12 67 34 5 974 尾部 34 67 2278第三步 進製 因為是以兩位數字分割的,所以進製是滿100進一位 尾部 留78,進22,即78 中部 9...

分治法求解大整數相乘問題

問題描述 設x和y都是n位的大整數,現在要計算它們的乘積xy。提示 採用分治法求解兩個十進位製大整數的乘法,以提高乘法的效率,減少乘法次數。計算公式為 xy ac10n a b d c ac bd 10n 2 bd 下面的例子演示了分治演算法的計算過程。設x 314l,y 5327,用上述演算法計算...

分治法的經典問題 大整數相乘

討論問題時,先來了解一下什麼是分治法。分治法的意思就是,分而治之,也就是把乙個問題,拆分成幾個小問題,最後再彙總解決的方法 假如現在我們要求兩個大整數相乘的乘積,如1234 1234 這裡為了了分析簡便,所以不舉形如1234567891234567這樣的大整數,不必要在此糾結 那麼按照我們小學學的乘...