题目大意:在不使用*、/、%这三种符号的情况下,算出商(dividend/divisor)
分析:数学思路考察。不让用除号可以考虑加减法,当dividend大于divisor的时候,dividend就可以减去一个divisor,最后的答案就是能减去divisor的个数,但是这种循环会超时,效率太低。所以我们考虑用移位这个符号,左移一位相当于乘2,左移n位就是乘2^n,大大缩减了减法的次数。最终结果就是divisor的所有系数相加,也就是为了左移所乘的乘数相加。dividend=divisor∗2n1+divisor∗2n2+...+divisor∗2n以
代码:转载自https://www.cnblogs.com/songlee/p/5738037.html
class Solution {
public:
int divide(int dividend, int divisor) {
bool positive = true; // 表示结果的正负
if((dividend>0 && divisor<0) || (dividend<0 && divisor>0))
positive = false;
long long absDividend = abs((long long)dividend);
long long absDivisor = abs((long long)divisor);
long long result = 0;
while(absDivisor <= absDividend) {
long long tmp = absDivisor;
long long count = 1;
while((tmp<<1) <= absDividend) {
tmp = tmp<<1; // divisor*2^n,divisor左移一直移到最接近dividend并且小于dividend
count = count<<1; // count = 2^n
}
result += count; // 系数累加
absDividend -= tmp;
}
if(positive && result >= INT_MAX)
return INT_MAX;
return positive ? result:-result;
}
};