问题:
给你两个整数 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