宣告:本文僅個人筆記
這裡面的o(n^2)就是下面的我自己畫的小學乘法計算複雜度示意圖
這裡有個問題就是4次n/2乘法怎麼變成n^log4的,等想好再來接著編輯吧
注意這裡的**是十進位製大整數進行相乘,而課本給出的是二進位制機器數進行相乘
xy = (a10^(n/2) + b)( c10^(n/2) + d)而且這裡**裡面是對ad+bc的另外一種形式的推導即「先加後減」= ac10^n + ad10^(n/2) + bc10^(n/2) + bd
= ac10^n + ((a-b)(d-c) + ac + bd)10(n/2) + bd
上面的最後一行理解為「先減後加」
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 進製...