力扣题 两数相除:画图解析 采用递归计算除法(不使用乘法、除法和 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);
    }
}
相关文章
|
29天前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
108 2
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
67 2
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
44 1
|
2月前
|
存储 固态存储 安全
阿里云服务器X86计算架构解析与X86计算架构云服务器收费价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中X86计算是用户选择最多的一种架构,本文将深入探讨阿里云X86计算架构的云服务器,包括其技术特性、适用场景、性能优势以及最新价格情况。
|
2月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
4月前
|
机器学习/深度学习 算法 数据库
阿里云服务器架构区别解析:从X86计算、Arm计算到高性能计算架构的区别参考
在我们选择阿里云服务器的架构时,选择合适的云服务器架构对于提升业务效率、保障业务稳定至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供参考和选择。
阿里云服务器架构区别解析:从X86计算、Arm计算到高性能计算架构的区别参考
|
3月前
|
KVM 虚拟化
计算虚拟化之CPU——qemu解析
【9月更文挑战10天】本文介绍了QEMU命令行参数的解析过程及其在KVM虚拟化中的应用。展示了QEMU通过多个`qemu_add_opts`函数调用处理不同类型设备和配置选项的方式,并附上了OpenStack生成的一个复杂KVM参数实例。
|
4月前
|
存储 数据挖掘 大数据
深度解析Hologres计算资源配置:如何根据业务场景选择合适的计算类型?
【8月更文挑战第22天】Hologres是一款由阿里云提供的分布式分析型数据库,支持高效的大数据处理与分析。本文通过电商优化商品推荐策略的案例,介绍了Hologres中的计算组型与通用型配置。计算组型提供弹性扩展资源,适合大规模数据及高并发查询;通用型则适用于多数数据分析场景,具备良好计算性能。通过实例创建、数据加载、计算任务建立及结果查询的步骤展示,读者可理解两种配置的差异并根据业务需求灵活选择。
66 2
|
4月前
|
缓存 JavaScript 前端开发

热门文章

最新文章

推荐镜像

更多