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

最新文章

  1. Android Studio :enable vt-x in your bios security,已经打开还是报错的解决方法
  2. [转]Centos安装zeromq和jzmq
  3. java设计模式--简单工厂模式
  4. nios II--实验3——led 100M软件部分
  5. Python字符串基础一
  6. ArcGIS 设置地图显示范围大小(全屏显示)
  7. Baseline管理
  8. 转:MVC 下导航超链接本页面高亮的一种解决方案
  9. vim 打开多个文件
  10. jsp request.getParameterValues获取数组值代码示例
  11. 必须掌握的八个cmd命令
  12. 维吉尼亚密码java完整版
  13. (一)Lua脚本语言入门
  14. Python网络数据采集4-POST提交与Cookie的处理
  15. canvas 从初级到XX 1# 部分非基础原生API的使用 [初级向]
  16. jquery添加属性使用attr、prop。
  17. jquery对象和DOM对象的相互转换详解
  18. docker:Dockerfile构建LNMP平台
  19. Apache访问控制
  20. node.js 爬虫动态代理ip

热门文章

  1. specialized English for automation-Lesson 2 Basic Circuits of Operational Amplifiers
  2. phalcon 设置cookie一直是httponly导致前端读取不到cookie的值
  3. LG2052 [NOI2011]道路修建
  4. WPF 设置TextBox为空时,背景为文字提示
  5. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
  6. Lucene/Solr搜索引擎开发笔记 - 写作方向调整
  7. 学习blus老师js(3)--定时器的使用
  8. Regenerate Script 重置脚本
  9. [失败]SystemTap和火焰图(Flame Graph)
  10. application/json 和 application/x-www-form-urlencoded的区别