python算法例13 两个整数相除

1. 问题描述

要求不使用乘法、除法和mod运算符,实现两个整数相除,如果溢出,返回2147483647。

2. 问题示例

给定被除数100,除数9,返回11。

3. 代码实现

使用减法来实现两个整数的相除,同时检查溢出情况

def divide(dividend, divisor):
    # 特殊情况处理
    if divisor == 0:
        return float('inf')
    if dividend == 0:
        return 0

    # 判断结果的符号
    negative = (dividend < 0) != (divisor < 0)

    # 将被除数和除数都转换为正数进行计算
    dividend = abs(dividend)
    divisor = abs(divisor)

    # 初始化商和余数
    quotient = 0
    remainder = 0

    # 循环减去除数直到被除数小于除数
    while dividend >= divisor:
        dividend -= divisor
        quotient += 1

    # 检查是否溢出
    if quotient > pow(2, 31) - 1:
        return pow(2, 31) - 1 if not negative else -pow(2, 31)

    # 返回结果,考虑符号
    return quotient if not negative else -quotient


dividend = 100
divisor = 9
result = divide(dividend, divisor)
print(result)  # 输出 11

定义了一个divide() 函数,它使用减法来实现两个整数的相除。首先处理特殊情况,然后判断结果的符号,并将被除数和除数转换为正数。接下来,通过循环减去除数直到被除数小于除数,同时记录商和余数。最后,检查是否溢出,并返回正确的结果。

使用位运算来实现相除操作

def divide(dividend, divisor):
    # 处理特殊情况
    if divisor == 0:
        return float('inf')
    if dividend == 0:
        return 0

    # 判断结果的符号
    negative = (dividend < 0) != (divisor < 0)

    # 将被除数和除数都转换为正数进行计算
    dividend = abs(dividend)
    divisor = abs(divisor)

    quotient = 0
    while dividend >= divisor:
        power_of_two = 1
        current_divisor = divisor
        while (current_divisor << 1) <= dividend:
            current_divisor <<= 1
            power_of_two <<= 1
        dividend -= current_divisor
        quotient += power_of_two

    # 检查是否溢出
    if quotient > pow(2, 31) - 1:
        return pow(2, 31) - 1 if not negative else -pow(2, 31)

    # 返回结果,考虑符号
    return quotient if not negative else -quotient


dividend = 100
divisor = 9
result = divide(dividend, divisor)
print(result)  # 输出 11

使用了位运算来实现相除操作。首先处理特殊情况,然后判断结果的符号,并将被除数和除数都转换为正数。接下来,使用循环和位运算来计算商,直到被除数小于除数为止。最后,检查是否溢出并返回正确的结果。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰星Charih

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值