Leetcode-29. Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

做除法,没有想到官网标准答案位运算,MAX_INT除1,用加减法循环算子一直是1,显然效率是问题

想到的做法是用新的算子做被减数,用 去逼近除数,

最后结果应该是:一个二次抛物线,在x=正整数时的一点y值的和,恰好等于除数。

具体代码如下:

int divide(int dividend, int divisor) {
	if (divisor == 0) {
		return INT_MAX;
	}
    if (dividend == 0 || (dividend != INT_MIN && (divisor == INT_MIN || abs(dividend) < abs(divisor)))){
    	return 0;
	}
	// dividend == INT_MIN || abs (dividend) >= abs(divisor)
	int mreturn = 0;
	bool mchar = false;	// -
	if (dividend < 0 && divisor < 0 || dividend > 0 && divisor > 0)  {
		mchar = true;	// +
	}
	
	if (dividend == INT_MIN) {
		if (divisor == INT_MIN) {
			return 1;
		}
		else {
			dividend += abs(divisor);
			mreturn += 1;			
		}
	} 
	dividend = abs(dividend);
	divisor = abs(divisor);
	
	int mdivide = 0;
	if (dividend >= divisor) {
		int upStairs = divisor;
		int time = 1;
		while (dividend >= upStairs) {	// upstairs
			dividend -= upStairs;
			mdivide += time;
			upStairs += divisor;
			++time;
			if (upStairs < 0) {
				break;
			}
		} 

		int downStairs = upStairs - divisor;
		--time;
		while (dividend >= divisor) {	// downstairs
			if (dividend >= downStairs) {
				dividend -= downStairs;
				mdivide += time;
			}
			downStairs -= divisor;
			--time;
		}
	}
	
	if (mchar) {	// +
		return (mreturn + mdivide) < 0 ? INT_MAX : (mreturn + mdivide);
	}
	else {		    // -
		return (-mreturn - mdivide) > 0 ? INT_MAX : (-mreturn - mdivide);
	}

}



欢迎批评指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值