Leetcode 29 两数相除 Divide Two Integers

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

方法:

首先,定下结果的符号,再将除数和被除数取绝对值,最后返回时再加上符号。

接着,函数主体是递归,每次将除数加倍,直到成为小于a的最大倍数,再返回剩余的部分除以除数的商。

针对特殊情况,当被除数为0时,直接返回0,当除数为-1时,若被除数为最小整数,则返回最大整数。

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (dividend==0)  return  0;
	if (divisor==1) return dividend;
	if (divisor==-1 && dividend==INT_MIN){
	    return INT_MAX;
	}

	long a=dividend,b=divisor;
	int sign=1;
	if((a<0&&b>0)||(a>0&&b<0)){
	    sign=-1;	
	}
	a=abs(a);
	b=abs(b);
	long res=div(a,b);
	if(sign==-1) return -res;
	else return res;
    }
    int div(long a,long b){
	if(a<b) return 0;
	long k=1;
	long kb=b;
	while((kb<<1)<a){
	    kb<<=1;
	    k<<=1;
	}
	return (k+div(a-kb,b));
    }
};

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值