LeetCode //C - 29. Divide Two Integers

29. Divide Two Integers

Given two integers dividend and divisor, divide two integers without using multiplication, division, and mod operator.

The integer division should truncate toward zero, which means losing its fractional part. For example, 8.345 would be truncated to 8, and -2.7335 would be truncated to -2.

Return the quotient after dividing dividend by divisor.

Note: Assume we are dealing with an environment that could only store integers within the 32-bit signed integer range: [ − 2 31 , 2 31 − 1 −2^{31}, 2^{31} − 1 −231,231−1]. For this problem, if the quotient is strictly greater than 2 31 − 1 2^{31} - 1 231−1, then return 2 31 − 1 2^{31} - 1 231−1, and if the quotient is strictly less than − 2 31 -2^{31} −231, then return − 2 31 -2^{31} −231.

Example 1:

Input: dividend = 10, divisor = 3
Output: 3
Explanation: 10/3 = 3.33333... which is truncated to 3.

Example 2:

Input: dividend = 7, divisor = -3
Output: -2
Explanation: 7/-3 = -2.33333... which is truncated to -2.

Constraints:
  • − 2 31 < = d i v i d e n d , d i v i s o r < = 2 31 − 1 -2^{31} <= dividend, divisor <= 2^{31} - 1 −231<=dividend,divisor<=231−1
  • divisor != 0

From: LeetCode

Link: 29. Divide Two Integers


Solution:

Ideas:
  1. Handle Signs: Compute the sign of the result based on the signs of dividend and divisor.
  2. Use Absolute Values: Since we're working with possible negative numbers, we convert everything into positive values for ease of calculation.
  3. Exponential Search: Use a method to subtract bigger chunks of the divisor from the dividend by shifting the divisor left (equivalent to multiplying the divisor by powers of 2) until we overshoot the dividend.
  4. Subtraction and Accumulation: Once the optimal subtraction chunk is identified, subtract it from the dividend and accumulate the count of how many times this chunk fits into the dividend.
  5. Overflow Handling: Make sure the result does not exceed the bounds defined by 32-bit integers.
Code:
c 复制代码
int divide(int dividend, int divisor) {
    // Edge cases for overflow
    if (dividend == INT_MIN && divisor == -1) {
        return INT_MAX;
    }

    // Determine the sign of the result
    int sign = (dividend > 0) ^ (divisor > 0) ? -1 : 1;

    // Work with absolute values to avoid overflow issues
    long long ldividend = llabs((long long)dividend);
    long long ldivisor = llabs((long long)divisor);

    long long result = 0;

    // Perform the division using bit manipulation and subtraction
    while (ldividend >= ldivisor) {
        long long temp = ldivisor, multiple = 1;
        while (ldividend >= (temp << 1)) {
            temp <<= 1;
            multiple <<= 1;
        }
        ldividend -= temp;
        result += multiple;
    }

    // Apply the sign to the result
    result = sign * result;

    // Handle potential overflow
    if (result > INT_MAX) return INT_MAX;
    if (result < INT_MIN) return INT_MIN;

    return (int)result;
}
相关推荐
徐子童1 小时前
优选算法---链表
数据结构·算法·链表·面试题
如意.7591 小时前
从零开始的指针(3)
算法
cwplh2 小时前
MX模拟赛总结
算法·动态规划
浅川.252 小时前
xtuoj 随机数
算法
shan&cen2 小时前
Day02 集合 | 30. 串联所有单词的子串、146. LRU 缓存、811. 子域名访问计数
java·数据结构·算法·缓存
NAGNIP2 小时前
大模型微调框架之TRL
算法
麦当_2 小时前
SwipeMultiContainer 滑动切换容器算法指南
前端·javascript·算法
橘子133 小时前
递归,搜索与回溯算法
算法
黄贵根3 小时前
C++20 基于文本文件的类对象增删查改系统
算法·c++20
max5006003 小时前
使用OmniAvatar-14B模型实现照片和文字生成视频的完整指南
图像处理·人工智能·深度学习·算法·音视频