C++:剑指Offer精讲1.整数除法
题目:001:整数除法
1.给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%'
注意:
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31−1]。本题中,如果除法结果溢出,则返回 2^31 − 1
示例 1:
输入:a = 15, b = 2
输出:7
解释:15/2 = truncate(7.5) = 7
示例 2:
输入:a = 7, b = -3
输出:-2
解释:7/-3 = truncate(-2.33333..) = -2
示例 3:
输入:a = 0, b = 1
输出:0
示例 4:
输入:a = 1, b = 1
输出:1
提示:
-2^31 <= a, b <= 2^31 - 1
b != 0
先展示一下我的代码结果
下面是详细的代码
class Solution {
public:int divide(int a, int b) {if (a == 0 || b == 1) return a;if (b == -1 && a == INT_MIN) return INT_MAX;int sign = (a > 0 ^ b > 0) ? -1 : 1;long la = abs((long)a);long lb = abs((long)b);long res = 0;while (la >= lb) {long temp = lb;long muti = 1;while (la >= temp << 1) {temp <<= 1;muti <<= 1;}la -= temp;res += muti;}return sign == 1 ? res : -res;};
};
以下是此代码增加注释后的版本:
class Solution {
public:// 函数实现除法功能,支持负数int divide (int a, int b) {// 如果除数是0或者被除数是1,返回被除数if (a == 0 || b == 1) return a;// 如果除数是-1且被除数是INT_MIN,返回INT_MAXif (b == -1 && a == INT_MIN) return INT_MAX;// 判断返回值正负号int sign = (a > 0 ^ b > 0) ? -1 : 1;// 将被除数和除数转为正数long la = abs((long)a);long lb = abs((long)b);// 返回值long res = 0;// 采用减法的方式实现除法while (la >= lb) {// 记录除数大小long temp = lb;// 乘数初始值long muti = 1; // 判断被除数是否大于除数*2while (la >= temp << 1) {// 将除数扩大一倍temp <<= 1;// 将乘数扩大一倍muti <<= 1; }// 被除数减去除数*乘数la -= temp;// 将乘数加入返回值中res += muti; }// 根据正负号决定返回值return sign == 1 ? res : -res;}
};
程序的步骤如下:
1. 如果除数是0或者被除数是1,返回被除数。
2. 如果除数是-1且被除数是INT_MIN,返回INT_MAX。
3. 判断返回值正负号。
4. 将被除数和除数转为正数。
5. 采用减法来实现除法,即每次将除数乘以一定系数,然后减去该值,直到被除数小于除数为止,每次减去的除数对应的乘数加入返回值中。
6. 根据正负号决定返回值。
5.应该是最让人迷糊的,我们来仔细讲解一下5
第5步的目的是模仿除法的运算,减去被除数和乘数的乘积,直到被除数小于除数为止。它首先比较被除数和除数,如果被除数比除数大,就把除数扩大一倍,并把乘数扩大一倍,一直循环,直到被除数小于除数。然后,减去除数和乘数的乘积,并把乘数加入到返回值中,最后根据被除数和除数的正负性来决定返回值的flag。
以被除数为7,除数为3为例来说明减法模拟除法:首先,比较7和3,因为7>3,所以我们将除数变为6,也就是说此时的除数乘以2,乘数也需要乘以2;然后,看被除数和新的除数,发现7<6,所以我们就减去除数乘以乘数,即减去3*2,结果就是7÷3=2。
C++:剑指Offer精讲1.整数除法相关推荐
- 【LeetCode】剑指 Offer 16. 数值的整数次方
[LeetCode]剑指 Offer 16. 数值的整数次方 文章目录 [LeetCode]剑指 Offer 16. 数值的整数次方 package offer;public class Soluti ...
- 剑指Offer #12 数值的整数次方(快速幂)
题目来源:牛客网-剑指Offer专题 题目地址:数值的整数次方 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和 ...
- 【附可运行代码】剑指 Offer 16. 数值的整数次方
立志用最少的代码做最高效的表达 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn).不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入:x = 2.00000, n = 10 ...
- 剑指Offer Ⅱ 001. 整数除法(力扣剑指Offer专项突击版——整数_1)
题目 给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'.除号 '/' 以及求余符号 '%' . 注意: 整数除法的结果应当截去(truncate)其小数部分,例如:tr ...
- 剑指Offer Ⅱ 003.二进制加法(力扣剑指Offer专项突击版——整数_3)
题目 给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组. 示例 1: 输入: n = 2 输出: [0,1,1] 解释: 0 --> 0 1 ...
- 《剑指offer》数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 分析:熟悉java中Math的话,直接调用即可,深刻说明在常规编程中熟悉java核 ...
- 《剑指Offer》 数值的整数次方
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 直接调用pow函数 代码: class Solution { pub ...
- 剑指Offer字符串转换成整数
题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...
- [剑指Offer]:数值的整数次方(循环解答,快速幂---递归、循环)
文章目录 题目描述 解答思路 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 示例: ...
最新文章
- java 日期的加减_用java实现日期类的加减
- 4_InfluxDB学习之InfluxDB的基本概念、InfluxDB中独有的概念(Point,series),InfluxDB学习之InfluxDB的基本操作,InfluxDB操作方式,crud
- 深入理解this和call、bind、apply对this的影响及用法
- columnproperty server sql_获取SQL Server表字段的各种属性
- 系统盘点Android开发者必须掌握的知识点,含小米、腾讯、阿里
- 数据科学入门与实战:玩转pandas之二
- 软件架构(5)---软件架构设计的一些总结和理解
- AGG第十八课 agg::trans_affine仿射变换
- Mysql之各种各样的函数啦
- VScode 配置 Java 环境
- linux中bzero函数,库函数
- andorid studio 无法识别app项目解决
- 测试脚本常用知识点python
- 太阳光轨迹软件_巧用虚拟天文馆软件Stellarium演示太阳周日视运动轨迹_贺志康...
- Win10网卡驱动突然消失
- 二维码定位算法流程图
- 数字化转型:信息系统的生命周期(一)
- 【关于Spring那些事】——与君初相识
- 李峋的爱心表白代码来了
- MySQL入门 - 数据分组之 group by
热门文章
- style常见的样式属性
- 动态图解实例 ConstraintLayout Chain
- java计算机毕业设计计算机课程在线培训学习管理系统MyBatis+系统+LW文档+源码+调试部署
- 电子竞技——靠智力取胜的体育项目
- PMP考试科目有什么?
- 46000\46001\46002\MNC\MCC\IMSI
- mysql存储过程 根据查询的结果集向表中插入数据
- Dr. Agrawal(Dharma P. Agrawal)
- L1-084 拯救外星人 C语言
- vscode必备常用插件