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

If it is overflow, return MAX_INT.

思路I:做减法,直到被除数<除数。但结果 Time Limit Exceeded

class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor==) //分母为0
return INT_MAX; long int lDividend = dividend;
long int lDivisor = divisor;
long int quote=;
bool pos = (lDividend>= && lDivisor>) || (lDividend< && lDivisor<);
lDividend = abs(lDividend);
lDivisor = abs(lDivisor); while(lDividend >= lDivisor){
lDividend-=lDivisor;
quote++;
} if(pos && -quote==INT_MIN){
return INT_MAX;
}
return (int) pos?quote:(-quote);
}
};

思路II:任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=2^0+2^1+2^2+...+2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基,移动k位。接下来我们每次尝试减去这个基,如果可以则结果增加加2^k。然后基继续右移迭代,直到基<divisor为止。因为这个方法的迭代次数是按2的幂知道超过结果,所以时间复杂度为O(logn)。

class Solution {
public:
int divide(int dividend, int divisor) {
if(divisor==) //分母为0
return INT_MAX; int res = ;
if(dividend==INT_MIN) //handle overflow
{
if(divisor==-)
return INT_MAX;
res = ;
dividend += abs(divisor);
}
if(divisor==INT_MIN) //handle overflow
return res; bool isNeg = ((dividend^divisor)>>!=)?true:false; //判断两数相乘除的结果
dividend = abs(dividend);
divisor = abs(divisor);
int digit = ; //标记除数乘了多少次2 //将除数向左移到最大
while(divisor<=(dividend>>)) //与被除数除2相比,为防止overflow
{
divisor <<= ;
digit++;
} while(digit>=)
{
if(dividend>=divisor)
{
dividend -= divisor;
res += <<digit; //除数左移了digit次,商就要加上2^digit
}
divisor >>= ;
digit--;
}
return isNeg?-res:res;
}
};

29. Divide Two Integers (INT; Overflow, Bit)的更多相关文章

  1. [Leetcode][Python]29: Divide Two Integers

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 29: Divide Two Integershttps://oj.leetc ...

  2. 29. Divide Two Integers - LeetCode

    Question 29. Divide Two Integers Solution 题目大意:给定两个数字,求出它们的商,要求不能使用乘法.除法以及求余操作. 思路:说下用移位实现的方法 7/3=2, ...

  3. Java [leetcode 29]Divide Two Integers

    题目描述: Divide two integers without using multiplication, division and mod operator. If it is overflow ...

  4. 【一天一道LeetCode】#29. Divide Two Integers

    一天一道LeetCode系列 (一)题目 Divide two integers without using multiplication, division and mod operator. If ...

  5. 29. Divide Two Integers (JAVA)

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  6. [leetcode]29. Divide Two Integers两整数相除

      Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...

  7. [leetcode]29. Divide Two Integers 两整数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  8. [LeetCode] 29. Divide Two Integers ☆☆

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  9. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

随机推荐

  1. ASP.NET FORM认证配置排错记录

    搞了2小时都不能实现自动跳转到登录页面,后删除了配置文件中的name,就解决问题了. <authorization>      <deny users="?" / ...

  2. Ubuntu文本编辑(vi和nano)命令

    vi是Unix世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台Unix机器都会提供这套软体就像windows的记事本一样. 键入 vi /etc/hosts 进入vi界面,把光标移动到文件未尾.按 ...

  3. Java第四次作业--面向对象高级特性(继承和多态)

    一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握类的继承概念和设计 掌握构造方法的继承原则 掌握方法重写 掌握super键字和final关键字 理解多态的概念,掌握通过方法重写和方法重载机制 ...

  4. [笔记]CodeIgniter的SESSION

         由于HTTP协议本身是无状态的,所以当保留某个用户的访问状态信息时,需要客户端有一个唯一标识传给服务端,这个唯一标识就是SESSION ID,存放在客户端的COOKIE中,然后服务端根据该标 ...

  5. 如何解决VC "应用程序无法启动,因为应用程序的并行配置不正确 sxstrace.exe"问题

    引用链接 http://blog.csdn.net/pizi0475/article/details/7790992 应用程序事件日志中: “C:\windows\system32\test.exe” ...

  6. 设置Nginx日志

    在nginx.conf文件或vhosts/*.conf文件中的access_log日志中指定级别为main. http { include mime.types; default_type appli ...

  7. Androoid studio 2.3 AAPT err(Facade for 596378712): \\?\C:\Users\中文文件夹\.android\build-cache

    错误如下: Error:Some file crunching failed, see logs for details Error:Execution failed for task ':app:m ...

  8. const 补充

    char const* ptr1const char * ptr2char * const ptr3 看到这三个const作何感想 其实const比较好理解的是const 后面整体是不能改变的(整体的 ...

  9. 微信小程序详解——页面之间的跳转方式【路由】和参数传递

    微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能.今天我们来研究小程序页面之间的跳转方式. 1.先导 在Andr ...

  10. MySQL建表规范与常见问题 (go)

    一. 表设计 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储精确 ...