leetcode29. Divide Two Integers
思路:辗除法可得到商,二进制辗除法和十进制是类似的,只是十进制的时候是每次进位是10,而二进制每次进位是2,且十进制进位方式是*10,二进制是左移一位。
x = ai*10^i+…
x = ai*2^i+….
一个道理
引申出题:只需用乘法,不许用除法,获取商。则可用类似原理解题
class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor==0) return INT_MAX;
long long int quotient = 0;
long long int quotientTemp = quotient;
bool flag = (dividend<0 && divisor<0 || dividend>0 && divisor>0) ? true : false;
long long int dividendLong = labs(dividend);
long long int divisorLong = labs(divisor);
long long int divisorTemp = labs(divisor);
long long int remainder = dividendLong;
long long int remainderTemp = dividendLong;
while(remainder >=divisorLong){
divisorTemp = divisorLong;
quotientTemp = 1;
while(remainder >=divisorTemp){
divisorTemp <<=1;
quotientTemp <<=1;
}
quotient += quotientTemp>>1;
remainder -= divisorTemp>>1;
}
if(quotient>=INT_MAX && flag) quotient = INT_MAX;
return flag ? quotient : 0l-quotient;
}
};