力扣题 两数相除:画图解析 采用递归计算除法(不使用乘法、除法和 mod 运算符)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 这是力扣上的一道题目,难度为中等,两数相除:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

这是力扣上的一道题目,难度为中等

@TOC

1、题目描述

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

在这里插入图片描述

2、题解效果

在这里插入图片描述

3、题解思路

举个栗子:11除以2

11先与2比大小,发现比2大,则将除数翻倍(加一次自己),结果1也翻倍,然后试试有没有比11大,不比11大就再翻倍,过程则变成(除数:2→4→8 结果1→2→4),到了除数为16时发现比11大了,就不要再翻倍了,除数依然设置成8且此时结果为4。

到这里时,再用11减去8,等于3,再去算3除以2的值,此时题目就变成了算3除以2,跟上面方法相同,算出来结果为1,此时题目变成1除以2,1小于2,结果为0。再把所有的结果加起来,4+1+0=5

在这里插入图片描述

再举个栗子:举个例子:11 除以 3 。

首先11比3大,结果至少是1, 然后让3翻倍,就是6。(结果也从1翻倍到2)

但发现11还是大于6,那我让这个6再翻倍,得12,11不比12大,吓死我了,差点让最小解2也翻倍得到4了。但是我知道最终结果肯定在2和4之间。也就是说2再加上某个数,这个数是多少呢?我让11减去刚才最后一次的结果6,剩下5,我们计算5是3的几倍,也就是除法,看,递归出现了。

在纸上画一画,模拟几遍就懂了,实在不行看代码吧!

4、代码

class Solution {
    public int divide(int dividend, int divisor) {
        if(dividend == 0) return 0;//0除以所有数为0
        if(divisor == -1){
            if(dividend>Integer.MIN_VALUE) return -dividend;// 只要不是最小的那个整数,都是直接返回相反数就好啦
            return Integer.MAX_VALUE;// 是最小的那个,那就返回最大的整数啦
        }
        int symFlag=1;//symFlag用于处理正负号的问题,如果两者同号,则为1,结果为正,异号,则为0,结果为负
        long longDividend = dividend;//转为long型是因为部分测试用例很刁钻
        long longDivisor= divisor;
        //把负的除数和负的被除数都转成正的便于计算,用symFlag处理正负号的问题
        if(longDividend<0){
            symFlag=-symFlag;
            longDividend=-longDividend;
        }
        if(longDivisor<0){
            symFlag=-symFlag;
            longDivisor=-longDivisor;
        }
        if(symFlag<0)
            return -divideFunc(longDividend,longDivisor);
        else
            return divideFunc(longDividend,longDivisor);
    }
    public int divideFunc(long dividend,long divisor){
        if(dividend<divisor)
            return 0;
        if(dividend==divisor)
            return 1;
        long tmpDivisor=divisor;
        long res=1;
        while(dividend>(tmpDivisor+tmpDivisor)){
            res=res+res;
            tmpDivisor=tmpDivisor+tmpDivisor;
        }
        return (int)res+divideFunc(dividend-tmpDivisor,divisor);
    }
}
相关文章
|
3月前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
184 2
|
3月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
62 1
|
6月前
|
缓存 JavaScript 前端开发
|
6月前
|
存储
LeetCode------递归(爬楼梯)
这篇文章通过LeetCode上的"爬楼梯"问题介绍了递归的基本概念和实现方法,包括递归公式的推导、基本递归实现、使用备忘录优化以避免重复计算,以及自底向上的迭代方法来提高效率。
LeetCode------递归(爬楼梯)
|
6月前
|
Kotlin
Kotlin 运算符详解:算术、赋值、比较与逻辑运算符全解析
## Kotlin 运算符 - **用途**: 对变量和值执行操作。 - **示例**: ```kotlin var x = 100 + 50 // 150 ``` - **分类**: - **算术**: `+`, `-`, `*`, `/`, `%`, `++`, `--`. - **赋值**: `=`, `+=`, `-=`. - **比较**: `==`, `!=`, `&lt;`, `&gt;`, `&lt;=`, `&gt;=`. - **逻辑**: `&&`, `||`, `!`.
82 2
|
6月前
|
SQL 测试技术 数据处理
|
8月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
8月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
8月前
|
SQL 算法 大数据
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)

推荐镜像

更多