LeetCode 29. Divide Two Integers(整数除法)

本文介绍了一种不使用乘法、除法和取模运算符实现整数除法的方法。通过将整数转换为长整型,并利用位运算进行模拟运算,解决了整数除法的问题。文章还讨论了如何判断溢出情况。

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

题目描述:

    Divide two integers without using multiplication, division and mod operator.
    If it is overflow, return MAX_INT.

分析:
    题意:给定两个整型数,求它们的商并返回(不能使用乘法、除法、取模运算符号,结果溢出则返回MAX_INT)
    思路:由于各种运算符的限制使用,我们考虑使用位运算来解决(因为位运算可以模拟出加法、减法、乘法、除法的运算过程)。为了方便判断溢出,我们先把两个数转化为长整型数(long long int)m、n,同时判断除法得到结果的正负号(并取得m、n的绝对值)。我们找到一个最大的指数exp,使得m大于等于(n << exp),那么(1  << exp)可以作为结果加入答案中,然后用m减去(n << exp)更新被除数,重复该过程模拟除法运算。最终返回答案。

代码:

#include <bits/stdc++.h>

using namespace std;

#define LL long long

// bit manipulation
class Solution {
public:
    int divide(int dividend, int divisor) {
		LL m = (LL) dividend;
		LL n = (LL) divisor;
		// Exceptional Case: 
		if(m == 0){
			return 0;
		}
		if(n == 0){
			return INT_MAX;
		}
		bool sign = false;
		// sign
		if(m < 0){
			sign = !sign;
			m = -m;
		}
		if(n < 0){
			sign = !sign;
			n = -n;
		}
		if(m < n){
			return 0;
		}		
		// get answer
		LL ans = 0;
		// not the condition: while(m > 0)
		while(m >= n){
			int exp = 0;
			while(m >= (n << (exp + 1))){
				exp++;
			}
			// ans += (LL)(1 << exp); will cause an error!
			ans += ((LL)1 << exp);
			m -= (n << exp);
		}
		if(sign){
			ans = -ans;
		}
		// check overflow
		if(ans > INT_MAX || ans < INT_MIN){
			ans = (LL)INT_MAX;
		}
        return (int)ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值