3.29leetcode两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333…) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333…) = -2

提示:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。

    #define INT_MAX 0X7FFFFFFF    
    #define INT_MIN 0X80000000    
    int divide(int dividend, int divisor){        
    int i,std=0;//std为判定标准,判定两数是否同号        
    int d1,d2,cnt=0;        
    if(dividend==INT_MIN && divisor == -1)//被除最小,除数为1,结果为-INT——MIN            
    return INT_MAX;        
    else if(dividend==INT_MIN && divisor == 1)            
    return INT_MIN;        
    if((divisor>0&&dividend>0)||(dividend<0&&divisor<0))        
    std=1;        
    if(divisor==dividend)//无论被除数和除数大小,两数相等,计算结果为1        
    return 1;        
    if(divisor==INT_MIN)        
    return 0;        
    if(dividend==INT_MIN){            
    dividend+=abs(divisor);            
    cnt++;        
    }//若被除数为INT_MIN,先减一次再运算        
    d1=abs(dividend);        
    if(divisor!=INT_MIN)        
    d2=abs(divisor);        
    else{            
    d2=abs(divisor+1);        
    }        
    if(d1==d2){            
    if(std==1)            
    return 1;            
    else            
    return -1;        
    }        
    if(d1==0)       
    return 0;        
    if(d1==INT_MIN){            
    d1=d1-1;            
    cnt++;            
    }        
    for(i=31;i>=0;i--){            
    if((d1>>i)>=d2){                
    cnt+=1<<i;                
    d1-=d2<<i;//防止d1除完的余数还是比d2大的情况出现,如果出现就会继续执行if语句            
    }        
    }            
    if(d1==d2)            
    cnt++;            
    if(std==0)            
    cnt=cnt*-1;                
    return (int)cnt;    
    }

这道题目,我一开始想到的就是用减法计算,在跨过一道一道坎后发现减法运算时间超时,因此不得不运用位运算(把代码从减法改到位运算感觉还行)。当然,我们首先还得把几种溢出情况排除才能进行计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值