从乘法、除法的定义可知最直观的思路就是循序减法,但是超时;因此,可以利用位运算,来代替乘法;
class Solution {
public:
int divide(int dividend, int divisor) {
// 此处强制装换(long long)必不可少,因为默认情况下,数字按照整型处理,因此-2147483648,若不加强制转化为long long处理的话,此处仍然按照整型处理;会出错;至于原因,看文末链接;
long long divid = dividend > 0 ? dividend : -(long long)dividend;
long long divis = divisor > 0 ? divisor : -(long long)divisor;
int shift = 31;
long long result = 0;
while (divid >= divis){
if (divis << shift <= divid){
// 1LL 后边的LL不能省略
result += 1LL << shift;
divid -= divis << shift;
}
--shift;
}
result = (dividend ^ divisor) >> 31 ? -result : result;
if (result > numeric_limits<int>::max()) return numeric_limits<int>::max();
else return result;
}
};
首先应该意识到的一点是,既然是Integer类型,那么就应该注意到符号问题,其次应该注意到边界问题,由于可能越界,因此数据计算的过程可以将数据扩展到long long类型,计算出结果以后再根据符号进行最终结果的输出。
参考链接:
整型转换的一个细节