LeetCode——Divide Two Integers

Divide Two Integers


Divide two integers without using multiplication, division and mod operator.
class Solution {
public:
    int divide(int dividend, int divisor) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
		int res=0;
    	int sign=0;
    	size_t i;
    	size_t len=8*sizeof(int);
		long long u1,u2;
    	
		
    	//判断除数的特殊情况
    	if(divisor==0){
    		return 0;
    	}
		else if(dividend==divisor){
			return 1;
		}
    	else{
    		//先将除数和被除数转换为正数	
			u1=(long long)dividend<0?-dividend:dividend;
			u1=u1==(-2147483647-1)?2147483648:u1;
			u2=(long long)divisor<0?-divisor:divisor;
			u2=u2==(-2147483647-1)?2147483648:u2;
			if(u2>u1){
			    return 0;
			}
    		//判断除数是否是2的n次幂,是的话就右移。
    		for(i=0;i<len-1;i++){
    			//找到除数最左端的1
    			if(!((1<<i)^u2)){
    				break;
    			}
    		}
    		if(i!=len-1){
    			//说明除数是2的i次幂
    			res=u1>>i;
    		}
    		else{
    			//否则只能用减法
    			
				i=0;
				while(u1>=u2){
					u1=u1-(u2<<i);//每次增加一倍
					if(u1<0){
						//这时应该减少倍数
						u1=u1+(u2<<i);
						i--;
						continue;
					}
					res=res+(1<<i);
					i++;
				}
    		}
    	}
		sign=((dividend&(1<<(len-1)))^(divisor&(1<<(len-1))));
    	if(sign){
    		res=-res;
    	}
    	return res;
    }
};

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值