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;
}
相关推荐
ChoSeitaku17 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__13522 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
Fuxiao___26 分钟前
不使用递归的决策树生成算法
算法
我爱工作&工作love我31 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
娃娃丢没有坏心思1 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui11 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农1 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode