1. 程式人生 > >只使用加法實現減法,乘法和除法 [# 68]

只使用加法實現減法,乘法和除法 [# 68]

問題:

給你兩個整數 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