LeetCode 29——两数相除

1. 题目

2. 解答

2.1. 方法一

题目要求不能使用乘法、除法和除余运算,但我们可以将除法转移到对数域

$$ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{lna - lnb}$$

这样就转化为指数、对数和减法运算了。因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号。

同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理。

class Solution {
public:

    int divide(int dividend, int divisor) {
        if(dividend == 0)  return 0;

        double a = fabs(dividend);
        double b = fabs(divisor);

        long result = exp(log(a) - log(b));

        if ((dividend < 0) ^ (divisor < 0)) result = -result;

        if (result > INT_MAX) result = INT_MAX;

        return result;
    }
};

2.2. 方法二

利用移位操作。看下面的例子:

$$ 10 \implies 2^1 * 3 + 2^0 * 3 \to \frac{10} {3} = 2^1 + 2^0 = 3$$

$$ 10 \implies 2^2 * 2 + 2^0 * 2 \to \frac{10} {2} = 2^2 + 2^0 = 5$$

$$ 10 \implies 2^3 * 1 + 2^1 * 1 \to \frac{10} {3} = 2^3 + 2^1 = 10$$

我们可以对被除数进行分解。以 10 和 3 为例,首先我们确定 3 的最高次系数,$ 10 > 32^1 $ && $ 10 < 32^2$,因此最高次系数为 2。然后我们用 10 减去 $32^1$,继续进行刚才的过程,$ 4 > 32^0 $ && $ 4 < 3*2^1$,2 的第二高次系数为 1。我们循环进行这个过程,直到最后的数小于除数为止,这些除数前面所有系数的和即为所求。

class Solution {
public:

    int divide(int dividend, int divisor) {

        long a = labs(dividend); // long 型数据占 8 个字节,labs() 函数对 long 求绝对值
        long b = labs(divisor);
        long temp = b;

        long result = 0;
        long cnt = 1;

        while (a >= b)
        {
            cnt = 1;
            temp = b;
            while (a >= (temp << 1))
            {
                temp  = temp << 1;
                cnt = cnt << 1; // 表征除数前面的各次系数
            }

            a -= temp;
            result += cnt;
        }

        if ((dividend < 0) ^ (divisor < 0)) result = -result;

        if (result > INT_MAX) result = INT_MAX; // INT_MAX = 2^32 - 1

        return result;*/
    }
};

获取更多精彩,请关注「seniusen」!

原文地址:https://www.cnblogs.com/seniusen/p/9853565.html

时间: 2024-08-02 15:44:44

LeetCode 29——两数相除的相关文章

[leetcode] 29. 两数相除

29. 两数相除 感觉是目前遇到过的最'难'过的题... 不让你用乘除法,看样子又是个涉及位运算的题. 上来打算暴力,只用减法,结果超时. 没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor << 1 < dividend ,假设此时左移了k次,这时after_divisor = 2^k * origin_divisor.此时dividend再减去after_divisor,这不相当于重复了之前暴力算法中2^k次减法操作嘛. 之后可以重复寻

LeetCode 29两数相除

给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 说明: 被除数和除数均为 32 位有符号整数. 除数不为 0. 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [?231, 23

LeetCode 29 - 两数相除 - [位运算]

题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = $10$, divisor = $3$输出: $3$ 示例 2: 输入: dividend = $7$, divisor = $-

LeetCode 29. 两数相除 时间击败【100.00%】 内存击败【76.25%】

不禁让我想起了计算机是怎样进行除法运算的,单独考虑溢出以及边界情况,单独考虑符号,其他过程和我们小学除法是一模一样的:左移除数(十进制就是扩大十倍,二进制扩大两倍),直到正好比被除数小,一边累加商(在我的代码里就是33行)一边减小被除数,直到被除数不能减小,右移除数,重复上述过程. 1 public int divide(int dividend, int divisor) { 2 if (dividend == Integer.MIN_VALUE && divisor == -1) re

每天AC系列(十三):两数相除

1 题目 LeetCode第29题,计算两数相除的商,不允许使用乘法,除法,求模运算符. 2 减法 首先判断结果是否需要加上负号,将商置为0后,被除数不断减去除数,同时商自增.最后根据是否有负号返回相应的商. boolean negative = true; if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) negative = false; dividend = d

[算法] LeetCode 1.两数之和

LeetCode 1.两数之和(python) 1.朴素解法 最朴素的两个for循环大法: class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(len(nums)): for j in range(i+1,len(nums)): if nums[i] + nums[j] == target: return [i, j] 但注意,不要用enumerate函数写,会超时

Leetcode29题两数相除

题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例一: 输入: dividend = 10, divisor = 3 输出: 3 示例二: 输入: dividend = 7, divisor = -3 输出: -2 说明: 1.被除数和除数均为 32 位有符号整数.2.除数不为 0.3.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−23

前端与算法 leetcode 1. 两数之和

目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[2,7,11,1,12,34,4,15],19的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 1. 两数之和 题目描述 给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给

两数相除,判断小数位是否有限位

You are given several queries. Each query consists of three integers p, q and b. You need to answer whether the result of p/q in notation with base b is a finite fraction. A fraction in notation with base b is finite if it contains finite number of n