计算机低能儿从0刷leetcode | 29.两数相除 | 倍增法

题目: 29. 两数相除

解答:

本题使用倍增法,这是之前从来没有接触过的方法,chatgpt的介绍是"倍增法的核心思想在于指数增长,即通过成倍增长快速接近目标,能高效地减少原本需要线性处理的计算量,使得原本可能需要多个步骤的计算转化为对数级别的快速操作",在本题中的体现就是每次把除数翻倍,如果翻倍后的结果比被除数小,那么就让倍数(count)也翻倍,否则除数和倍数都不变,直到不能再继续的时候,让被除数中剩下的部分和除数进行相同的操作。主要思路如下:

1、首先进行边界的处理。

2、做除法运算的准备工作,也就是让除数和被除数都变为负数,同时记录下最终结果的符号,这是因为负数的范围最小可以取到-2147483648,如果用正数处理,最大只能取到2147483647。而因为负数的转换,在代码实现中的逻辑与前文描述略有不同,也就是翻倍后的结果要比除数大时才可以让倍数翻倍。

3、核心函数为div函数,用来进行倍增操作。将每次调用倍增函数的结果累加起来,就是最后商的数值。此处需要注意,while语句中的条件如果写作while(tmp+tmp>=a)或者while(2*tmp>=a)都会溢出,比如-1610612736 + -1610612736的时候,因此我们写为 while(tmp-a+tmp>=0)就可以避免这种情况。

以下为代码实现:

复制代码
class Solution {
public:
    int divide(int dividend, int divisor) {
        int res=0;int flag=1;
        if(dividend==2147483647&&divisor==1) return 2147483647;
        if(dividend==-2147483648&&divisor==-1) return 2147483647;
        if(dividend==-2147483648&&divisor==1) return -2147483648;

        if(dividend>0) {flag=-flag; dividend = -dividend;}
        if(divisor>0) {flag=-flag; divisor=-divisor;}
        
        res = div(dividend,divisor);
        res=res*flag;

        return res;
    }

    int div(int a,int b){
        if(a>b)  return 0;
        int count=1;
        int tmp=b;
        while(tmp-a+tmp>=0){
            tmp=tmp*2;
            count=count*2;
        }

        count=count+div(a-tmp,b);
        return count;
    }
};
相关推荐
算法鑫探5 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue5 小时前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5165 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX16 小时前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白6 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin6 小时前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
weixin_513449967 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf7 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer
烟锁池塘柳07 小时前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象