只使用加法實現減法,乘法和除法 [# 68]
阿新 • • 發佈:2019-02-13
問題:
給你兩個整數 a 和 b,僅僅使用加法,實現 a - b, a * b, a / b。
分析:
對於減法,因為 a - b = a + (-1) * b, 換句話說,我們只要得到 b 的相反數,就可以用加法實現 a - b。
對於乘法,a * b 相當於是 對 |a| 做 |b| 次連加, 或者對 |b| 做 |a| 次連加,但是,這裡我們必須要注意,a 和 b 都有可能是負數。
對於除法,a / b 相當於是讓|b| 自己加自己,然後我們設定一個計數器,當|b| 加自己大於 |a| 的時候,計數器停。但是,這裡有可能會帶餘數(除不盡),這裡,假設我們考慮的是四捨五入的方法。
減法程式碼:
因為我們要對b 取反,所以首先實現取反的程式碼:
public static int negate(int b) {
int value = (b < 0 ? 1 : -1);
int negate = 0;
while (b!= 0) {
negate += value;
b += value;
}
return negate;
}
當對 b 取反以後, a + negate(b) 就實現 a - b 了。
public static int substract(int a, int b) {
return a + negate(b);
}
乘法程式碼:
因為我們需要對 |a| 進行 |b| 次連加,但是,我們不知道 a, b 的正負,所以,我們首先需要取得 a, b 的絕對值,然後再決定整個乘法最後值的正負。
取絕對值程式碼如下:
public int abs(int value) {
if (value >= 0 ) return value;
else return negate(value);
}
決定整個乘法的正負的程式碼:
public static boolean positive(int a, int b) {
if ((a > 0 && b > 0) || (a < 0 && b < 0)) return true;
else return false;
}
實現乘法的程式碼:
public static int times(int a, int b) { if (abs(a) > abs(b)) return times(b, a); //faster int result = 0; for (int i = 1; i <= abs(a); i++) { result += abs(b); } if (positive(a, b) == true) return result; else return negate(result); }
除法程式碼:
public static int divide(int a, int b) {
int count = 0;
for(int i = abs(a); i >= abs(b); i -= abs(b)) {
count++;
}
int remaining = substract(abs(a), times(abs(b), count));
if (times(remaining, 2) >= abs(b)) {
count++;
}
if (positive(a, b) == true) return count;
else return negate(count);
}
轉載請註明出處:blog.csdn.net/beiyeqingteng