题目源地址:https://oj.leetcode.com/problems/divide-two-integers/
题目:实现两个整数的除法,但是不允许用乘、除、取余符号操作符。
int divide(int dividend, int divisor) {
unsigned int dvd = dividend < 0 ? -dividend : dividend;
unsigned int dvs = divisor < 0 ? -divisor : divisor;
const unsigned int absDivisor = dvs;
int step = 0;
while (dvs < dvd)
{
dvs = dvs << 1;
step++;
}
unsigned int result = 0;
while (dvd >= absDivisor)
{
if (dvd >= dvs)
{
dvd -= dvs;
result += 1u << step;
}
dvs = dvs >> 1;
step--;
}
return (dividend<0 == divisor<0) ? result : -result;
}
基本思想就是把除数向左移位(×2)然后与被除数比较,直到发现仅次于被除数的那个值,减去该值后继续。
算法基于下面这篇博客。但它的实现,在处理符号问题时,使用了乘法。此处进行了改进。
参考:
http://fisherlei.blogspot.jp/2012/12/leetcode-divide-two-integers.html