1.Divide Two Integers
来源:https://leetcode.com/problems/divide-two-integers/description/
题意
给出两个int数a,b,要求计算他们的商,不能使用乘、除、取模。
思路
- 很直接想法按照除法的定义,当a,b都大于0时,a不断减b,直到余数比b小,记录一共减了多少次,就是所求的答案。但是这样会超时。
- 这是参考答案的思路:我们可以不1个1个除数地除,而可以除数的指数倍来除。比如说,15/3,我们发现 15 > 3, 于是尝试 2*3=6, 发现15 > 6, 于是继续尝试 4 * 3 = 12,发现15 > 12,继续尝试12 * 2 = 24。 但是15 < 24,因而,15 - 12 = 3, 是余数,记录此时减掉了4个3。对余数3继续上述过程,需要减去1个3。总共加起来减去了4+1 = 5个3, 结果就是3.
代码
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1: 1;
long long dvd = labs(dividend);
long long dvs = labs(divisor);
int res = 0;
while(dvd >= dvs) {
long long temp = dvs, multiple = 1;
while(dvd >= (temp << 1)) {
temp <<= 1;
multiple <<= 1;
}
dvd -= temp;
res += multiple;
}
return sign == 1? res: -res;
}
};