leetcode

来源:互联网 发布:房贷利息抵扣个税算法 编辑:程序博客网 时间:2024/05/18 12:34

Question29–Divide Two Integers

给定两个int型数,一个被除数,一个除数(不为零),在不使用乘法、除法、取余操作的条件下,求出商。若溢出,则返回INT_MAX。

算法

  1. 溢出的情况只有一种,即被除数为INT_MIN,除数为-1.
  2. 确定符号,两个数同号为正,异号为负,因此可以用异或操作来定符号。
  3. 当然最容易的就是一直用被除数减去除数,记录次数,直到被除数小于除数。但这样会超过时间限制。
  4. 另一种方法是,在不断减的过程中,让除数翻倍,即第一次减掉一个除数,第二次除数变为原来2倍,因此减掉两个原始除数,一直做,直到除数翻倍时大于了剩余的被除数,则从头来过,将除数置为初始的除数。

code

int divide(int dividend, int divisor) {    if(dividend==INT_MIN&&divisor==-1) return INT_MAX;    int sign=((dividend<0)^(divisor<0))?-1:1;    long long a=labs(dividend), b=labs(divisor);    int quotient=0,q=1;    long long sum;    while(a>=b){        sum=b;        q=1;        a=a-sum;        quotient+=q;        while((sum<<1)<=a){            sum=sum<<1;            q=q<<1;            a=a-sum;            quotient+=q;        }    }    return sign*quotient;}
原创粉丝点击