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