Divide Two Integers

本文介绍了一种不使用乘法、除法和取模运算符实现两个整数相除的方法。通过二分查找的方式逐步逼近结果,有效处理了包括负数在内的各种情况,并考虑了整数溢出的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

If it is overflow, return MAX_INT.

Tag: 二分求解,相当于每次除数都乘以2,注意考虑负数的情况和整数溢出的情况。

int divide(int dividend, int divisor)
{
	const int MAX_INT = (unsigned)(-1)>>1;
	const int MIN_INT = (unsigned)(~MAX_INT);

	if(dividend == divisor) return 1;
	if(divisor == 0 || (dividend == MIN_INT && divisor == -1)) return MAX_INT;
	if(divisor == MIN_INT) return 0;
	if(divisor == 1) return dividend;
	if(divisor == -1) return -dividend;

	bool negtive = (dividend < 0) ^ (divisor < 0);
	long _dividend, _divisor;
	if(dividend < 0)
	{
		if(dividend == MIN_INT)
			_dividend = (long) MAX_INT + 1l;
		else
			_dividend = -dividend;
	}else{
		_dividend = dividend;
	}

	_divisor = (divisor < 0) ? -divisor : divisor;

	int result = 0;
	while(_divisor <= _dividend)
	{
		int ans = 1;
		long div_tmp = _divisor;
		while(_dividend >> 1 >= div_tmp)
		{
			ans <<= 1;
			div_tmp <<= 1;
		}
		result += ans;
		_dividend -= div_tmp;
	}
	return (negtive) ? -result : result;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值