• LeetCode:29. 两数相除


    1)题目

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

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

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

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

    示例 1:

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

    示例 2:

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

    提示:

    • -2^31 <= dividend, divisor <= 2^(31 − 1)
    • divisor != 0

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/divide-two-integers
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2)思路

    一开始是全部转成正数,后面发现比较麻烦,就采用全部转为负数这种方案。
    代码优化思路:
    
    dividend = 100, divisor = 3
    return i   1	2	4	8	16	32
    divisor    3	6	12	24	48	96
    
    dividend = 96 + 3 = 991
    输出:i = 32 + 1 = 33
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3)代码

    1.初始代码

    直接循环相减

    public static int divide(int dividend, int divisor) {
    	// ------------ 前面的代码部分 ---------------
        if (dividend == 0) return 0;
        // 除数为1或-1
        if (divisor == 1) return dividend;
        if (divisor == -1) {
            if (dividend == Integer.MIN_VALUE) {
                return Integer.MAX_VALUE;
            }
            return -dividend;
        }
    
        // 除数等于被除数
        if (dividend == divisor) return 1;
    
        // 默认为正的
        boolean flag = true;
        // 全部转为负数
        if (dividend > 0) {
            dividend = -dividend;
            flag = !flag;
        }
        if (divisor > 0) {
            divisor = -divisor;
            flag = !flag;
        }
    
        // 被除数小于除数
        if (dividend > divisor) return 0;
        // ------------ 前面的代码部分 ---------------
    
    	// ------------ 优化的代码部分 ---------------
        int i = 0;
        while (!(dividend > divisor)) {
            dividend -= divisor;
            ++i;
        }
        // ------------ 优化的代码部分 ---------------
       
        return flag ? i : -i;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    2.第一次优化

    循环相减改良版

    public static int divide2(int dividend, int divisor) {
        // 前面的代码同上
    
    	// ------------ 优化的代码部分 ---------------
        int i = 1;
        int value = divisor;
        while (dividend - divisor <= value) {
            if (dividend - divisor <= divisor) {
                divisor += divisor;
                i += i;
            } else {
                divisor += value;
                ++i;
            }
        }
        // ------------ 优化的代码部分 ---------------
    
        return flag ? i : -i;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.第二次优化

    采用递归方法

    public static int divide(int dividend, int divisor) {
        // 前面的代码同上
    
    	// ------------ 优化的代码部分 ---------------
        int i = divideValue(dividend, divisor, 0);
        // ------------ 优化的代码部分 ---------------
    
        return flag ? i : -i;
    }
    
    
    private static int divideValue(int dividend, int divisor, int i) {
        if (dividend > divisor) return 0;
        int value = divisor;
        int num = 1;
        while (dividend - value <= value) {
            value += value;
            num += num;
        }
        i = num + divideValue(dividend - value, divisor, i);
        return i;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    4)结果

    1.初始结果

    在这里插入图片描述

    2.第一次优化结果

    在这里插入图片描述

    3.第二次优化结果

    在这里插入图片描述

  • 相关阅读:
    Multitask Vision-Language Prompt Tuning
    java计算机毕业设计学科竞赛管理系统源码+数据库+系统+lw文档+部署
    YOLO系列总结:YOLOv1, YOLOv2, YOLOv3, YOLOv4, YOLOv5, YOLOX
    使用Pytorch手写ViT — VisionTransformer
    VR禁毒教育 | 毒品认知VR虚拟仿真科普:提高青少年抵制毒品的意识和能力
    对闲鱼的调研分析
    【无标题】
    Dialog组件
    大数据开发(Spark面试真题-卷一)
    C和指针 第11章 动态内存分配 11.3 calloc和realloc
  • 原文地址:https://blog.csdn.net/m0_53151171/article/details/130810182