演算法設計與分析 大整數乘法

2022-07-16 06:48:12 字數 1673 閱讀 5832

宣告:本文僅個人筆記

這裡面的o(n^2)就是下面的我自己畫的小學乘法計算複雜度示意圖

這裡有個問題就是4次n/2乘法怎麼變成n^log4的,等想好再來接著編輯吧

注意這裡的**是十進位製大整數進行相乘,而課本給出的是二進位制機器數進行相乘

xy = (a10^(n/2) + b)( c10^(n/2) + d)

= ac10^n + ad10^(n/2) + bc10^(n/2) + bd

= ac10^n + ((a-b)(d-c) + ac + bd)10(n/2) + bd

上面的最後一行理解為「先減後加」

而且這裡**裡面是對ad+bc的另外一種形式的推導即「先加後減」

package cn.htu.test;

public class bigdataride

public static double bigdataride(long x,long y,int n)

else

long a = x / math.round(math.pow( 10 , (n / 2)));//移位操作,可以理解為小數點相對左移了

long b = x - a * math.round(math.pow( 10 , (n / 2)));//得到的就是低位數值

long c = y / math.round(math.pow( 10 , (n / 2)));

long d = y - c * math.round(math.pow( 10 , (n / 2)));

double ac = bigdataride(a,c,n/2);//遞迴計算a*c

double bd = bigdataride(b,d,n/2);//計算b*d

long sum_ab = a + b;

long sum_cd = c + d;

double abcd = bigdataride(sum_ab,sum_cd,n/2);

//以上總共呼叫了3次遞迴函式即log3

//原來推導式裡面的((a-b)(d-c)+ac+bd)的結果其實就是先減再加,下面的是先加再減

//即(a+b)(c+d)-ac-bd == ad+bc

return (ac*math.pow(10,n) + (abcd - ac - bd)*math.pow(10,n/2) +bd);

} }

public static void main(string args)

double s = bigdataride(x,y,n);//s是數值部分

system.out.println("大數相乘的計算結果為:"+s*sig); } }

演算法設計與分析基礎 大整數乘法string版

include include include include includeusing namespace std class bigdecimal bigdecimal string n bigdecimal operator bigdecimal b else 開始進行加法運算 while j...

演算法 大整數乘法

問題描述 求兩個不超過200位的非負整數的積。輸入形式 有兩行,每行是乙個不超過200位的非負整數,沒有多餘的前導0。輸出形式 一行,即相乘後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。樣例輸入 1234567890 9876543210 樣例輸出 1219326...

分治演算法 大整數乘法

用分治演算法程式設計實現兩個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 進製...