博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]29.Divide Two Integers
阅读量:7175 次
发布时间:2019-06-29

本文共 2749 字,大约阅读时间需要 9 分钟。

【题目】

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

【分析】

不能用乘除和取模,就只能用加减和位运算。

最简单的方法就是不断的减去被除数。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。但是这样会超时。

【代码】

/**********************************   日期:2015-01-24*   作者:SJF0115*   题目: 29.Divide Two Integers*   网址:https://oj.leetcode.com/problems/divide-two-integers/*   结果:AC*   来源:Time Limit Exceeded*   博客:**********************************/#include 
using namespace std;class Solution {public: int divide(int dividend, int divisor) { // 当dividend=INt_MAX时,-dividend会溢出,用long long long long a = dividend >= 0 ? dividend : -(long long)dividend; // divisor=INt_MAX时,-divisor,用long long long long b = divisor >= 0 ? divisor : -(long long)divisor; int count = 0; // 不断减 while(a >= b){ a -= b; count ++; }//while // 正负 int isPositive = (dividend ^ divisor) >> 31; if(isPositive == 0){ return count; }//if else{ return -count; }//else }};int main(){ Solution solution; int dividend = -2147483648; int divisor = -1; int result = solution.divide(dividend,divisor); // 输出 cout<
<

【分析二】

通过上面超时的例子可以总结出一点东西,做一些优化。

利用位运算每次把被除数翻倍,从而加速。

【代码二】

/**********************************   日期:2015-01-25*   作者:SJF0115*   题目: 29.Divide Two Integers*   网址:https://oj.leetcode.com/problems/divide-two-integers/*   结果:AC*   来源:Time Limit Exceeded*   博客:**********************************/#include 
#include
using namespace std;class Solution {public: int divide(int dividend, int divisor) { // 当dividend=INt_MAX时,-dividend会溢出,用long long long long a = dividend >= 0 ? dividend : -(long long)dividend; // 当divisor=INt_MAX时,-divisor会溢出,用long long long long b = divisor >= 0 ? divisor : -(long long)divisor; long long result = 0; // 不断减 while(a >= b){ long long c = b; for(int i = 0;a >= c;++i,c <<= 1){ a -= c; result += 1 << i; }//for }//while // 正负 if((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0)){ result = -result; }//if // If it is overflow, return MAX_INT. if (result > INT_MAX || result < INT_MIN){ result = INT_MAX; } return static_cast
(result); }};int main(){ Solution solution; int dividend = -2147483648; int divisor = -1; int result = solution.divide(dividend,divisor); // 输出 cout<
<

之前忽略一个细节:
If it is overflow, return MAX_INT.

2147483648 overflow 所以返回MAX_INT    2147483647

你可能感兴趣的文章
404 Error on Fonts in Tomcat/Java Web App
查看>>
十进制转十六进制
查看>>
【学习笔记2】第一个Struts2应用开发
查看>>
写在 TiDB 1.0 发布之际 | 预测未来最好的方式就是创造未来
查看>>
android 自定义ViewPager
查看>>
seajs的使用1.0
查看>>
实用SQL语句
查看>>
14-利用思维导图梳理JavaSE-大汇总
查看>>
Java多线程系列--“基础篇”04之 synchronized关键字
查看>>
apache/commons/httpclient学习笔记
查看>>
mysql 查看死锁和去除死锁
查看>>
SpringMVC深度探险
查看>>
曲线图
查看>>
修改组策略--取消徽标测试
查看>>
BeanUtils1.9.1 简单使用
查看>>
FFmpeg数据结构彻底分析——AVFormatContext
查看>>
javascript中的函数currying(柯里化) 的理解
查看>>
Java为满足两对象根据类的属性值相等从而对象相等,需要重写equal hashcde
查看>>
2015.05.26 工作任务与心得
查看>>
JAVA中关于Synchronized和Volatile的测试
查看>>