题目
解题
解题一
// javascript
var multiply = function(A, B) {
let bigger = (A > B) ? A : B;
let smaller = (A < B) ? A : B;
return multiplyHelper(smaller, bigger);
};
var multiplyHelper = function(smaller, bigger) {
if (smaller === 0) return 0;
if (smaller === 1) return bigger;
let halfProd = multiplyHelper(smaller >>> 1, bigger);
halfProd <<= 1;
if ((smaller & 1) === 1) halfProd += bigger;
return halfProd;
};
注意开始要先把 smaller 和 bigger 找到。这个算法的运行时间是 O(log s),其中 s 是两个数中最小的那个。
解题二
// javascript
var multiply = function(A, B) {
let bigger = A > B ? A : B;
let smaller = A < B ? A : B;
let prod = 0
for (let i = 0; smaller !== 0; i++) {
if ((smaller & 1) === 1) {
prod += bigger << i;
}
smaller >>>= 1;
}
return prod;
};
解题三
A ∗ B = ( A ∗ 2 ) ( B / 2 ) = ( A ∗ 2 ) ( B / / 2 ) + A ∗ ( B % 2 ) A∗B=(A∗2)(B/2)=(A∗2)(B//2)+A∗(B\%2) A∗B=(A∗2)(B/2)=(A∗2)(B//2)+A∗(B%2)
// javascript
var multiply = function(A, B) {
let bigger = A > B ? A : B;
let smaller = A < B ? A : B;
return multiplyHelper(smaller, bigger);
};
var multiplyHelper = function(smaller, bigger) {
if (smaller === 0) return 0;
if (smaller === 1) return bigger;
let prod = multiplyHelper(smaller >>> 1, bigger << 1);
if ((smaller & 1) === 1) prod += bigger;
return prod;
};