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. JSP session过期时间(小记)

    以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate()方法. ...

  2. 使用eclipse启动系统时报错“ java.lang.OutOfMemoryError: PermGen space”问题的解决

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76571611 本文出自[我是干勾鱼的博客] 有的时候,使用eclipse启动系统 ...

  3. cuDnn的安装ubuntu16.04环境下(tensorflow正式安装之前的必备安装操作)

    首先,下载cuDnn,地址如下: https://developer.nvidia.com/rdp/cudnn-archive 本人下载,Linux版本: 解压: tar -zxvf cudnn-8. ...

  4. 项目代码matlab

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  5. gradle 代理设置

    可以对gradle全局设置变量,也可以针对单个项目进行配置. 只需要在.gradle目录下创建一个gradle.properties文件,文件中按照如下格式添加代理配置 systemProp.http ...

  6. c++ int 转 string 实现前缀补0

    最近需要读取一些格式化路径的文件.路径文件名字最后是数字从0开始到100结束,但是占了4位,即0000到0100这样. 需要将int转成string的同时加上前缀0. 方法一: 用sprintf()函 ...

  7. L3-011 直捣黄龙 (30 分)

    本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  8. ACM学习历程—HDU2476 String painter(动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...

  9. StringUtils.isEmpty()和isBlank()的区别

    一.概述 两种判断字符串是否为空的用法都是在程序开发时常用的,相信不少同学在这种简单的问题上也吃过亏,到底有什么区别,使用有什么讲究,带着问题往下看. 二.jar包 commons-lang3-3.5 ...

  10. RHEL6安装Oracle 11g R2

    收藏PDF版质料请点这里:http://download.csdn.net/detail/jifeng3518/6464999 1.使用DVD做yum源1.1.新建dvd挂载目录[root@oracl ...