大整數相乘 分治法(JS)

2021-09-17 02:20:07 字數 2488 閱讀 3153

相乘的基本原理

如: 1234 * 567
第一步:分解

234 -> 12 和 34;

567 -> 5 和 67;

第二步:分別計算 

首部: 12*5=60

中部:12*67+34*5=974

尾部:34*67=2278

第三步:進製(因為是以兩位數字分割的,所以進製是滿100進一位)

尾部:留78,進22,即78

中部:974+22=996,留96,進9,即96

首部:60+9=69,即69

第四步:重組

首部+中部+尾部:699678

分治法思想

2135415134543*4573756875685這樣的算式分解成2135415*45737562135415*875685+4573756*134543134543*875685,接下來使用遞迴再分解即可。

資料的物件型別

如:123

numberobject

注意事項

1、每個函式的用法原始碼中有注釋

2、存貯的字串是數字的倒序,如輸入"123",儲存為"321",計算時也是用"321"

3、測試函式為test(x,y),x和y必須為字串型別才能進行計算大整數的相乘

源**

// 整數的建構函式

function numberobject( string , sign )

else if ( sign === 1)else

this.sign = sign;

}// 字串顛倒 (傳入字串, 傳出字串)

function reversestring(string)

// 補零 (傳入字串, 傳出字串)

function addfrontzero( string , length )

}return string;

}// 去零 (傳入字串,傳出字串)

function deletefrontzero( string )

if(arr.length === 0)

return arr.join('');

}// 將引數統一轉換為字串

function numbertransform(number)

}// 分析元素

function numberanalysis( number )

for(let i = 1; i < raw.length; i++)

}if( raw[0] === '-' )else

}// 數字相加,(傳入字串,傳出字串)

function addstring( first, second ) else if( !fst[i] && scd[i] )else if( fst[i] && !scd[i] )else if( !fst[i] && !scd[i] && carry === 1)else

// js 的商一般都為小數,需要取整

carry = math.floor( carry );

}return rst.join('');

}function multiply( first , second )

return new numberanalysis( rst );

}// 實現分治法

function pieceofmultiplication( first, second )

if(i > second.length - 1)

}let half = math.floor( length / 2 );

// 分割數字

let firstleft = first.slice(0, half);

let firstright = first.slice( half );

let secondleft = second.slice(0, half);

let secondright = second.slice( half );

// 遞迴長度大於2的數相乘

if( half >= 2 )

// 兩位數相乘

else if( half === 1)

else

}// 規定: 傳入的x 和 y 資料型別必須為字元型,因為大整數為預設判定為數字上限

function test(x, y)

else if(rst.sign === 1)

}

分治法 大整數相乘

大整數相乘 a b兩個整數,a有n位 123456 n b有m位 123456 m 一般的思路是像最初學習乘法時一樣逐位相乘後相加,但是這樣做演算法的複雜度過高,但這仍然是解題的基本思想。既然提到分治,那麼如何分,怎麼治?能夠找到乙個大問題劃分為小問題方法的重要技巧是能夠看到大問題的規模和所謂規模的...

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

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

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

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