算法题:整数除法
创始人
2024-03-02 11:56:12
0

一.题目描述以及来源

给定两个整数 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-2end

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

实现的代码如下:

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/7while (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<

 上面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;}

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...