算法题:整数除法

news2024/11/25 14:58:57

一.题目描述以及来源

给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。

注意:

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/xoh6Oh
 

例子:

输入:a = 15, b = 2
输出:7
解释:15/2 = truncate(7.5) = 7
输入:a = 7, b = -3
输出:-2
解释:7/-3 = truncate(-2.33333..) = -2
输入:a = 0, b = 1
输出:0
输入:a = 1, b = 1
输出:1

二.解题思路

a=15b=2k=0
15>=b(a>=b)a=13k=1
15-2>=bk=2
13-2>=b3
11-2>=b4
9-2>=b5
7-2>=b6
5-2>=b7
3-2<bend

因为不能用除法,所以只能使用减法去实现除法。

实现的代码如下:

public static void Divide(int a, int b)
    {
        //int sign = 1;
        //if((a>0 && b<0)||(a<0 && b > 0))
        //{
        //    sign= -1;
        //}
        int sign = (a > 0) ^ (b > 0) ? -1 : 1;
        a=Math.Abs(a); b=Math.Abs(b);
        int res = 0;
        while(a>=b)
        {
            a=a-b;
            res++;
        }
        if(sign==-1)
        {
            res = -res;
        }
        System.Console.WriteLine(res);
    }

此外还需要考虑,除法的符号,以及边界问题

 //时间复杂度是O(n),
    public static int DivideRange(int a, int b)
    {
        //32位最大值: 2^31-1=2147483647
        //32为最小值:-2^31=—2147483648
        //—2147483648/(-1)=2147483648>—2147483647 越界
        if ((a == (-2147483648)) && (b == (-1))){
            return 2147483647;
        }             
        int sign = (a > 0) ^ (b > 0) ? -1 : 1;
        //Math.Abs(—2147483648)=—2147483648  所以我们将正数转成负数去计算
        if (a > 0)
        {
            a = -a;
        }
        if (b > 0)
        {
            b = -b;
        }
        int res = 0;
        //-7 /-2  =3 ,都是负数除法 转成 数学,循环是<=   例如 -7<=-2 ,继续循环
        while (a <= b)
        {
            a = a - b;
            res++;
        }
        if (sign == -1)
        {
            res = -res;
        }
        return res;
    }

上面为解体的完整代码,需要注意的有

1.范围时,注意范围的边界(最小值/-1  会越界,最小值取正数 会保持原值)

2.将所有数转成负数去进行计算,因为最大值可以取相反数,最小值相反数越界

3.原本数字都变成正数的时候,判断是a>=b,作为循环的条件。转成负数计算的时候,循环的条件是a<=b

4.在c#中Integer.MIN_VALUE为


int max = int.MaxValue;
int min = int.MinValue;

三. 解题思路(2)

此思路看不懂的话可以去看看leetcode讲解视频:简单易懂Java/C++ /Python/js/go - 整数除法(剑指) - 整数除法 - 力扣(LeetCode)

 

public static int DivideVersion2(int a, int b)
    {
        //32位最大值: 2^31-1=2147483647
        //32为最小值:-2^31=—2147483648
        //—2147483648/(-1)=2147483648>—2147483647 越界
        if ((a == (-2147483648)) && (b == (-1)))
        {
            return 2147483647;
        }
        int sign = (a > 0) ^ (b > 0) ? -1 : 1;
        //Math.Abs(—2147483648)=—2147483648  所以我们将正数转成负数去计算
        if (a > 0)
        {
            a = -a;
        }
        if (b > 0)
        {
            b = -b;
        }
        int res = 0;
       
        //  22/7
        while (a <= b)
        {
            int value = b;
            int k = 1;
            while (a < value + value)
            {
                k = k + k;
                value = value + value;
            }
            res += k;
            a = a - value;

        }
        if (sign == -1)
        {
            res = -res;
        }
        System.Console.WriteLine(res);
        return res;
    }

此方法会超时,而且会有越域的情况

四,解题思路(3)位运算

在三的解题思路之上,我们知道我们可以实行b*2去减去a一半的情况。将b*2转换成b<<2,b往左移一位。

 

public class Solution {
    public int Divide(int a, int b) {
          if ((a == int.MinValue) && (b == (-1)))
        {
            return int.MaxValue;
        }
        int res = 0;

        if (b == int.MinValue) {
        return a == b? 1 : 0;
    }
         // 被除数先减去一个除数
    if (a == int.MinValue) {
        a -= -Math.Abs(b);
        res += 1;
    }


        int sign = (a > 0) ^ (b > 0) ? -1 : 1;
        a = Math.Abs(a); b = Math.Abs(b);
        
        for(int i = 31; i >= 0; i--)
        {
            if ((a >> i) - b >= 0)
            {   
                if (res > int.MaxValue - (1 << i)) {
                    return int.MinValue;
                }            
                a=a-(b<<i);
                res = res + (1<<i);
            }
        }
        if (sign == -1)
        {
            res = -res;
        }
        return res;
    }
}

 上面for循环内实现了整个逻辑,需要注意的是i=0是表示-b本身,所以需要i>=0.

 以下是处理边界值的代码,测试之前没发现。


        if (b == int.MinValue) {
        return a == b? 1 : 0;
    }
         // 被除数先减去一个除数
    if (a == int.MinValue) {
        a -= -Math.Abs(b);
        res += 1;
    }

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

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

相关文章

MP157-2-TF-A移植:

MP157-2-TF-A移植&#xff1a;1. TF-A移植&#xff1a;1.1 新建开发板的设备树1.2 修改设备树电源管理1.3修改TF卡和EMMC设备树1.4 修改USBOTG设备树2 编译测试2.1 Makefile.sdk 修改内容&#xff1a;2.2 编译命令&#xff1a;正点原子第九章内容&#xff1a;自己记的笔记&…

SpringBoot(One·上)

SpringBoot一、简介概述Spring Boot特性SpringBoot四大核心二、SpringBoot项目分析1、创建第一个案例结构目录和pom文件2、Springboot集成mvcSpringboot核心配置文件application.propertiesSpringboot核心配置文件application.yml或者application.yamlapplication.ymlapplicati…

Allegro削铜皮详细操作指导

Allegro削铜皮详细操作指导 Allegro可以编辑任意形状的铜皮,下面介绍几种削铜皮的方式 任意形状,shape-manual Void/cavity-Polygon 鼠标左键点击铜皮,铜皮会被亮起来 画出需要的形状 完成后如下图 方形shape-manual Void/cavity-Rectangular 同样的选择铜皮,画出需要…

通过 js 给元素添加动画样式animation属性 ,以及 perspective 属性探究

学习关键语句: js添加动画效果 js控制元素animation属性 写在前面 在制作组件的过程中呢 , 突然觉得这个动画啊应该由用户来决定到底是个啥样 , 但是怎么让用户操作这一步呢 ? 总不能让用户自己去写 css keyframe 吧 , 所以便有了这篇文章 , 同时 , 这篇文章的下半部分我们会…

Python+Selenium:Google patent数据爬取

准备工作,已搭建Python环境,安装Selenium pip install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 步骤1: 根据Chrome版本下载ChromeDriver 下载链接地址: ChromeDriver - WebDriver for Chrome - Downloads 如在帮助——>关于Ch…

车道线检测-lanedet

源码&#xff1a;https://github.com/Turoad/lanedet 这是一个常见的检测网络整合版本&#xff0c;目前包括的检测网络有&#xff1a; 模型论文介绍 SCNN&#xff0c;RESA论文介绍&#xff0c;UFLD介绍&#xff0c;laneNet|其它相关模型&#xff0c;LaneATT介绍 数据集介绍…

机器学习之归一化

机器学习之归一化1.目的1.1损失函数求解问题1.2 归一化目的2. 归一化2.1 最大值最小值归一化2.2 标准化1.目的 1.1损失函数求解问题 线性回归Loss函数梯度公式 参数含义θ\thetaθ函数参数α\alphaα学习率xjix^i_{j}xji​x:数据集&#xff0c;i:样本&#xff0c;j:特征 【数…

OPengl学习(二)——opengl环境搭建

文章目录0、 概念/准备1、VSOpengl快速添加手动编译2、QT中使用opengl1.pro配置文件2.引入头文件 继承QGLWidget3.实现三个主要函数3、引用0、 概念/准备 opengl官网地址 1、OpenGL 函数库相关的 API 有核心库&#xff08;gl&#xff09;&#xff0c;实用库&#xff08;glu&a…

自动化状态监测和工业4.0解决方案-Softing uaGate SI

某公司为其注塑和反应/挤出系统采用了uaGate SI网关技术并实行了开放且独立于平台的OPC UA标准&#xff0c;以用于设备状态自动化监控&#xff0c;这有助于提高产量并避免机器停机。 自动化状态监测提高了产量并且可避免机器停机。为了将其设备控制系统与IT系统相连接起来&…

最小生成树(Prim算法与Kruskal算法)

一、什么是最小生成树 一个连通图的生成树是一个极小的连通子图&#xff0c;它含有图中全部的n个顶点&#xff0c;但只有足以构成一棵树的n&#xff0d;1条边。我们把构造连通网的最小代价生成树称为最小生成树。 例如下图中①、②、③都是左侧图的生成树&#xff0c;但③是构…

k8s的亲和调度

k8s的亲和调度 出于高效通信等需求&#xff0c;偶尔需要把一些Pod对象组织在相近的位置(同一节点、机架、区域或地区等)&#xff0c;例如应用程序的Pod及其后端提供数据服务的Pod等&#xff0c;我们可以认为这是一类具有亲和关系的Pod对象。 理想的实现方式是允许调度器把第一个…

[附源码]计算机毕业设计springboot高校流浪动物领养网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2022.11.28总结

今天写了条件查询 虽然思路上还说是比较顺&#xff0c;但是还是写了一晚上&#xff0c;因为老是在细节上出现bug&#xff0c;改了好久&#xff0c;踩了好几个坑。 首先大概是因为组件不是确定的&#xff0c;我把ref属性绑定在router-view上&#xff0c;导致我获取不到条件选择…

c++类型转换

目录 1.隐式类型转换和强制类型转换 2.隐式类型转换带来的危险 3.c提供的标准类型转换关键字 4.总结 1.隐式类型转换和强制类型转换 c语言的类型转换可以分为隐式类型转换和强制类型转换。 #include<iostream>using namespace std;int main() {double a 3.14;int …

医疗保健行业的福音是对话式AI吗?

导读对话式AI可以对医疗保健行业产生重大影响&#xff0c;且在许多领域已经产生了影响。如果使用得当&#xff0c;对话式AI可以提高操作效率和临床结果&#xff0c;并减轻医护人员的工作量。 对话式AI技术开启了数字患者护理的新时代。 患者可以随时访问其需要的数据&#xff…

Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10

Xshell远程连接进行Ubuntu的Pytorch配置写在最前面参考Xshell常用命令Ubantu检查系统的各项配置查看ubuntu系统的版本信息和gcc版本查看Linux的内核版本和系统是多少位的验证机器是否具有n卡各种配置&#xff08;建议不要省略&#xff09;安装vim增加pip镜像源禁用nouveau开启S…

[附源码]计算机毕业设计springboot高校学生摄影作品展示平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

app与小程序的区别【开发小程序】

app与小程序&#xff0c;两者有什么区别呢&#xff1f;很多公司在开发app或是开发小程序上比较纠结&#xff0c;二选一不止究竟选哪个好&#xff0c;当然有财力的公司可能会两者都开发。那么下面说说app与小程序的区别是什么&#xff0c;好让大家更好地二选一。 app与小程序的…

单商户商城系统功能拆解39—分销应用—分销等级

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

2022小美赛数学建模ABCD赛题思路分析 - 认证杯

一、竞赛信息 考虑到美国大学生数学建模竞赛即将举行&#xff0c;近几年国内院校参加美赛的热情一直比较高涨&#xff0c;去年参赛规模已经突破了30000支队&#xff0c;但是由于美赛需要用英文书写论文&#xff0c;中文和英文的语法和思维差异比较明显&#xff0c;另外美赛参赛…