7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only the add operator.
這道題讓我們實現乘法加法和除法,而且規定了只能使用加法。那麼我們先來看如何用加法來實現減法,我們知道,減去一個數就等於加上這個數的負數。那麼我們先寫一個求負數的函式,對於n來說,我們累計n個-1,對於-n來說,我們累計n個1。這樣減法的就搞定了,我們再來看乘法,乘法也可以看做加法的一種,比如a乘以b,就是b個a相加的結果,我們最後來判斷正負,如果a和b的符號相反,我們再呼叫之前的求負數的函式即可。最後就是除法了,除法也可以轉為加法,比如a除以b,那麼我們可以先初始化商為0,然後用商加上b和a比較,如果小的話,商就加一,再比較,以此類推直到大於等於a,符號也是最後來判斷,這樣我們就用加法實現了乘法減法和除法了,參見程式碼如下:
class Solution { public: int negate(int a) { int res = 0, d = a < 0 ? 1 : -1; while (a != 0) { res += d; a += d; } return res; } int minus(int a, int b) { return a + negate(b); } int multiply(int a, int b) { if (a < b) return multiply(b, a); int res = 0; for (int i = 0; i < abs(b); ++i) { res += a; } return b > 0 ? res : negate(res); } int divide(int a, int b) { if (b == 0) return INT_MAX; int m = abs(a), n = abs(b); int res = 0, product = 0; while (product + n <= m) { product += n; ++res; } if ((a < 0 && b < 0) || (a > 0 && b > 0)) return res; else return negate(res); } };
LeetCode中有一道Divide Two Integers 兩數相除的題,那道題的除法實現過程較為複雜,但是演算法很高效,可以看看。