[置顶] 只使用加法实现减法,乘法和除法 [# 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

你可能感兴趣的:([置顶] 只使用加法实现减法,乘法和除法 [# 68])