• 【LeetCode】29. 两数相除


    1 问题

    给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算

    整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

    返回被除数 dividend 除以除数 divisor 得到的 商 。

    注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

    示例 1:

    输入: dividend = 10, divisor = 3
    输出: 3
    解释: 10/3 = 3.33333… ,向零截断后得到 3 。

    示例 2:

    输入: dividend = 7, divisor = -3
    输出: -2
    解释: 7/-3 = -2.33333… ,向零截断后得到 -2 。

    2 答案

    自己写的,时间超出限制

    class Solution:
        def divide(self, dividend: int, divisor: int) -> int:
            res = 0
            a = True
            if dividend > 0 and divisor < 0:
                a = False
            elif dividend < 0 and divisor > 0:
                a = False
            dividend, divisor = abs(dividend), abs(divisor)
            while dividend >= divisor:
                dividend -= divisor
                res += 1
            if a:
                return res
            else:
                return -res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    官方解,利用位运算

    class Solution:
        def divide(self, dividend: int, divisor: int) -> int:
            sign = (dividend > 0) ^ (divisor > 0)  # 异或 两个位相同为0,相异为1
            dividend = abs(dividend)
            divisor = abs(divisor)
            count = 0
            
            while dividend >= divisor:  # 要等于号,不然乘除情况不行
                count += 1
                divisor <<= 1 # 左移一位乘2
            result = 0
            while count > 0:
                count -= 1
                divisor >>= 1 # 右移一位除2
                if divisor <= dividend:  # 要等于号,不然乘除情况不行
                    result += 1 << count #这里的移位运算是把二进制(第count+1位上的1)转换为十进制,左移count位
                    dividend -= divisor
            if sign: result = -result
            return result if -(1<<31) <= result <= (1<<31)-1 else (1<<31)-1 # 这里只写 (1<<31)-1,因为只有-2147483648/-1可能越界,必须写括号,不然不会先算位运算
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    类似于位竖式除法,代码中 dividend >= divisor divisor <= dividend,要等于号,不然乘除情况不行
    在这里插入图片描述

  • 相关阅读:
    【初始C语言】/*C语言初阶指针通俗详解*/
    Win11安装最新Android studio时闪退
    vue(路由router、路由传参、嵌套、路由守卫)
    javascript脚本书写的位置
    CocoaPods 在iOS开发中养活了这么多项目,它到底是个啥?
    数据结构(C语言版)严蔚敏->排序
    软件开发人员 Kubernetes 入门指南|Part 2
    平衡二叉树(AVL) 的认识与实现
    AC牛客 BM16 删除有序链表中重复的元素-II
    Ansible 的脚本 --- playbook 剧本
  • 原文地址:https://blog.csdn.net/CSDNLHCC/article/details/133874782