leetcode 29:两数相除

通过使用位运算可以解决该问题

需要注意的是当dividend=INT_MIN和divisor=-1时 得到的商将会溢出

任何一个整数都可以表示成以2的幂为底的一组基的线性组合

每次将除数左移到大于被除数的上一位,使用被除数减去移位之后的数, 持续这个直到基为0

int divide(int dividend,int divisor){
    if(dividend==INT_MIN&&divisor==-1)
        return INT_MAX;
    long d=std::abs(long(dividend));
    long b=std::abs(long(divisor));
    long res=0;
    if(b==1)    
        return (int)(((dividend<0)^(divisor<0))?d*-1:d);
    
    while(d>=b){
        long tmp=b;
        long p=1;
        while(d>=(tmp<<1)){
            tmp<<=1;
            p<<=1;
        }
        d-=tmp;
        res+=p;
    }
    return (int)(((dividend<0)^(divisor<0))?-res:res);
}

猜你喜欢

转载自blog.csdn.net/u013263891/article/details/83756933
今日推荐