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

news2025/5/16 21:08:26

29. 两数相除

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

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

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

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

https://leetcode.cn/problems/divide-two-integers/description/

方法二、根据递归法总结进行化简

首先根据方法一里面的描述,我们已经理解 并得出了这个递归的过程,所以我们来进一步优化迭代的运算,

为了节省函数调用次数,用循环来代替递归的过程即可
我们先找到最大的那个可以减去的数字,
然后再进行右移找尽可能大的那个可以减去的数字

有一个细节是要把整数变成负数后再进行运算,因为补码的表示范围中,负数比正数多出来一位
因此用减法运算可以减少边界判断的次数。

我在代码里使用了移位,

maxSub <<= 1; // 被除数翻倍
// 也可以写成 maxSub+=maxSub;

上下两种写法效果和结果完全一样,
移位据说更省,

但是我想现代的编译器,应该会自己优化这样的运算。

if (ratio == 0) {
     ratio = 1;
}

这里的判断不可以省略,
因为32/2 = (32-16-8-4-2-2)/2 +8+4+2+1+1= 8+4+2+1+1 = 16
否则会输出15,答案错误

在这里插入图片描述

class Solution {
public:
    int divide(int dividend, int divisor) {
        // 处理边界情况
        if (dividend == INT_MIN && divisor == 1)
            return INT_MIN;
        if (dividend == INT_MIN && divisor == -1)
            return INT_MAX;
        if (divisor == 0)  // 除0是非法的
            return 0;

        // 两个正数,得到signal true,一正一负,都得到signal
        // false,两个负数得到signal true;
        bool signal = true;
        if (dividend > 0) {
            dividend = -dividend;
            signal = !signal;
        }
        if (divisor > 0) {
            divisor = -divisor;
            signal = !signal;
        }

        int maxSub = divisor;
        int ans = 0, ratio = 1;
        // 注意下面的计算都是负数!
        while (maxSub > dividend - maxSub) {
            maxSub <<= 1; // 被除数翻倍
            // 也可以写成 maxSub+=maxSub;
            ratio <<= 1;  // 倍率翻倍
        }
        // 先移动到最左边找到了最大的ratio
        while (dividend <= divisor) {
            // 逐步右移回去
            if (dividend - maxSub >= maxSub && dividend - maxSub <= 0) {
                ans += ratio; // 如果找到了当前合适的最大的maxSub就扣除并添加倍率
                dividend -= maxSub;
            }
            maxSub = maxSub >> 1;
            ratio = ratio >> 1;
            if (ratio == 0) {
                ratio = 1;
            }
        }
        if (!signal) {
            return -ans;
        }
        return ans;
    }
};

方法一、递归法:

例如10/3 = (10-6-3)/3+2+1 这个等式成立

所以我们应该先去找一个最小的X,使得X*2大于等于10,可以知道X=3,6,12,24,48……这样翻倍,
由于当X = 6的时候12大于10,此时可以进行运算10-6 = 4,

运算后剩下4,再对4重复上面的过程,4-X<3可知X=3,

因此可以每次都X+=X,并且假设ans=1跟着X每次都ans+=1,

  • X=3 ,ans=1
  • X=6,ans=2;
  • X=12, ans=4;
  • X=24,ans =8 (3*8=24) 这说明这个ans就是我们要求和的值。

因此可以找到10/3的时候,ans = 2+1+0 = 3,也就是我们的10/3的答案。

在这里插入图片描述

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (divisor == 0) {
            return 0;
        }
        //处理特殊情况,边界情况
        if (dividend == INT_MIN && divisor == 1) {
            return INT_MIN;
        }
        if (dividend == INT_MIN && divisor == -1) {
            return INT_MAX;
        }
        // 全都变成负数,然后再做加减法
        if (dividend > 0)
            return -divide(-dividend, divisor);
        if (divisor > 0)
            return -divide(dividend, -divisor);
        if (dividend > divisor) {
            return 0;
        }
        int maxSub = divisor;
        int ans = 1; // 每次都加上这个最大的倍数
        while (dividend - maxSub <= maxSub) {
            maxSub += maxSub;
            ans += ans;
        }
        return ans + divide(dividend - maxSub, divisor);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于服务器只能访问localhost:8111地址,局域网不能访问的问题

一、问题来源&#xff1a; 服务器是使用的阿里云的服务器&#xff0c;服务器端的8111端口没有设置任何别的限制&#xff0c;但是在阿里云服务器端并没有设置相应的tcp连接8111端口。 二、解决办法&#xff1a; 1、使用阿里云初始化好的端口&#xff1b;2、配置新的阿里云端口…

基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差&#xff08;MMSE&#xff09;检测算法 4.4 迫零&#xff08;ZF&#xff09;检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …

Linux 配置时间服务器

一、同步阿里云服务器时间 服务端设置 1.检查chrony服务是否安装&#xff0c;设置chrony开机自启&#xff0c;查看chrony服务状态 [rootnode1-server ~]# rpm -q chrony # rpm -q 用于查看包是否安装 chrony-4.3-1.el9.x86_64 [rootnode1-server ~]# systemctl enable --n…

可视化web组态开发工具

BY组态是一款功能强大的基于Web的可视化组态编辑器&#xff0c;采用标准HTML5技术&#xff0c;基于B/S架构进行开发&#xff0c;支持WEB端呈现&#xff0c;支持在浏览器端完成便捷的人机交互&#xff0c;简单的拖拽即可完成可视化页面的设计。可快速构建和部署可扩展的SCADA、H…

C++笔记-模板初阶,string(上)

一.模板初阶 1.泛型编程 以往我们要交换不同类型的两个数据就要写不同类型的交换函数&#xff0c;这是使用函数重载虽然可以实现&#xff0c;但是有以下几个不好的地方&#xff1a; 1.重载的函数仅仅是类型不同&#xff0c;代码复用率比较低&#xff0c;只要有新类型出现时&a…

关于cmd中出现无法识别某某指令的问题

今天来解决以下这个比较常见的问题&#xff0c;安装各种软件都可能会发生&#xff0c;一般是安装时没勾选注册环境变量&#xff0c;导致cmd无法识别该指令。例如mysql&#xff0c;git等&#xff0c;一般初学者可能不太清楚。 解决这类问题最主要的是了解环境变量的概念&#x…

绿联NAS安装内网穿透实现无公网IP也能用手机平板远程访问经验分享

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好&#xff0c;今天给大家带来一个超级炫酷的技能——如何在绿联NAS上快速安装cpolar内网穿透工具。想象一下&#xff0c;即使没有公网IP&#xff0c;你也能随时随地远程访问自己…

d9-326

目录 一、添加逗号 二、爬楼梯 三、扑克牌顺子 添加逗号_牛客题霸_牛客网 (nowcoder.com) 一、添加逗号 没啥注意读题就是 注意逗号是从后往前加&#xff0c;第一位如果是3的倍数不需要加逗号&#xff0c;备注里面才是需要看的 count计数 是三的倍数就加逗号&#xff0c…

Win11+VS2022+CGAL5.6配置

1. CGAL库简介 CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个开源的计算几何算法库&#xff0c;主要用于处理几何问题和相关算法的实现。它提供了丰富的几何数据结构和高效算法&#xff0c;覆盖点、线、多边形、曲面等基本几何对象的表示与操…

【Linux】MAC帧

目录 一、MAC帧 &#xff08;一&#xff09;IP地址和MAC地址 &#xff08;二&#xff09;MAC帧格式 &#xff08;三&#xff09;MTU对IP协议的影响、 &#xff08;四&#xff09;MTU对UDP协议的影响 &#xff08;五&#xff09;MTU对TCP协议的影响 二、以太网协议 &…

Codeforces Round 1013 (Div. 3)(A-F)

题目链接&#xff1a;Dashboard - Codeforces Round 1013 (Div. 3) - Codeforces A. Olympiad Date 思路 找到第一个位置能凑齐01032025的位置 代码 void solve(){int n;cin>>n;vi a(n10);int id0;map<int,int> mp;for(int i1;i<n;i){cin>>a[i];mp[a…

Vite 与 Nuxt 深度对比分析

一、核心定位差异 二、核心功能对比 渲染能力 Vite&#xff1a;默认仅支持客户端渲染&#xff08;CSR&#xff09;&#xff0c;需通过插件&#xff08;如vite-plugin-ssr&#xff09;实现 SSR/SSG&#xff0c;但配置灵活 Nuxt&#xff1a;原生支持 SSR&#xff08;服务端渲…

通过一个led点灯的demo来熟悉openharmony驱动编写的过程(附带hdf详细调用过程)

概述 本应用程序(led_rgb)是在上实现直接通过消息机制与内核驱动进行交互&#xff0c;设置RGB三色灯的亮灯行为。我从网上随便找了个demo测试了一下&#xff0c;坑了三天…&#xff0c;整个状态如下图&#xff0c;同时也迫使我深度梳理了一下整个流程框架。直到绝望的时候&…

pycharm2024.1.1版本_jihuo

目录 前置&#xff1a; 步骤&#xff1a; step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置&#xff1a; 之…

目标检测20年(四)——最终章

欢迎各位读者尽情阅读前三篇文献解读。这一篇将会介绍文献的第五部分&#xff1a;目标检测近些年的新技术发展以及第六部分&#xff1a;总结与未来展望。这也是本篇论文解读的最后一篇文章。 目录 五、目标检测最新进展 5.1 不采用滑动窗口的检测 5.2 旋转和尺度变化的鲁棒性…

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量&#xff1a; 接口&#xff1a; 二、基于环形队列的生产消费者模型 环形队列&#xff1a; 单生产单消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.cc&#xff1a; 多生产多消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.…

Spring Boot 连接 MySQL 配置参数详解

Spring Boot 连接 MySQL 配置参数详解 前言参数及含义常用参数及讲解和示例useUnicode 参数说明&#xff1a; 完整配置示例注意事项 前言 在 Spring Boot 中使用 Druid 连接池配置 MySQL 数据库连接时&#xff0c;URL 中 ? 后面的参数用于指定连接的各种属性。以下是常见参数…

[linux] linux基本指令 + shell + 文件权限

目录 1. Linux的认识 1.1. Linux的应用场景 1.2. Linux的版本问题 1.3. 操作系统的认识 1.4. 常用快捷键 2. 常用指令介绍 2.1. ADD 2.1.1. touch [file] 2.1.1.1. 文件的属性信息 2.1.2. mkdir [directory] 2.1.3. cp [file/directory] 2.1.4. echo [file] 2.1.4.…

Python实现小红书app版爬虫

简介&#xff1a;由于数据需求的日益增大&#xff0c;小红书网页版已经不能满足我们日常工作的需求&#xff0c;为此&#xff0c;小编特地开发了小红书手机版算法&#xff0c;方便大家获取更多的数据&#xff0c;提升工作效率。 手机版接口主要包括&#xff1a;搜素&#xff0…

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…