【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 答案

自己写的,时间超出限制

python 复制代码
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

官方解,利用位运算

python 复制代码
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可能越界

类似于位竖式除法,代码中 dividend >= divisor divisor <= dividend,要等于号,不然乘除情况不行

相关推荐
BD4SXV28 分钟前
线性二次调节器(Linear Quadratic Regulator,LQR)的无限时域最优控制求解与黎卡提方程
算法·自动化
ST——Jess36 分钟前
2026年度传统文化数字化与命理科技(Ethno-tech)行业趋势研究报告:专业级数智工作台的技术壁垒与评测标准
人工智能·科技·算法·架构
Matrix_111 小时前
第13篇:非线性位移场——漩涡、鱼眼、水波纹与球面化
图像处理·算法
金牌归来发现妻女流落街头1 小时前
【LeetCode 第207题】
算法·leetcode·拓扑·领接表
熬夜敲代码的猫1 小时前
AVL树(C++详解版)
数据结构·c++·算法
-To be number.wan1 小时前
算法日记 | STL-MAP
c++·算法
cjp5601 小时前
015. UG 二次开发,拉伸草图生成实体类,高级草图类封装
算法
Eric 辰东2 小时前
【C 语言程序的编译和链接】详解编译链接过程
c语言·笔记·算法·学习方法
迈巴赫车主2 小时前
蓝桥杯21247弹跳鞋java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
jghhh012 小时前
基于 Weiler-Atherton 算法的多边形裁剪程序实现
算法