29. Divide Two Integers (INT; Overflow, Bit)
2024-10-15 19:58:14
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;
}
};
最新文章
- Android Studio :enable vt-x in your bios security,已经打开还是报错的解决方法
- [转]Centos安装zeromq和jzmq
- java设计模式--简单工厂模式
- nios II--实验3——led 100M软件部分
- Python字符串基础一
- ArcGIS 设置地图显示范围大小(全屏显示)
- Baseline管理
- 转:MVC 下导航超链接本页面高亮的一种解决方案
- vim 打开多个文件
- jsp request.getParameterValues获取数组值代码示例
- 必须掌握的八个cmd命令
- 维吉尼亚密码java完整版
- (一)Lua脚本语言入门
- Python网络数据采集4-POST提交与Cookie的处理
- canvas 从初级到XX 1# 部分非基础原生API的使用 [初级向]
- jquery添加属性使用attr、prop。
- jquery对象和DOM对象的相互转换详解
- docker:Dockerfile构建LNMP平台
- Apache访问控制
- node.js 爬虫动态代理ip
热门文章
- specialized English for automation-Lesson 2 Basic Circuits of Operational Amplifiers
- phalcon 设置cookie一直是httponly导致前端读取不到cookie的值
- LG2052 [NOI2011]道路修建
- WPF 设置TextBox为空时,背景为文字提示
- hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)
- Lucene/Solr搜索引擎开发笔记 - 写作方向调整
- 学习blus老师js(3)--定时器的使用
- Regenerate Script 重置脚本
- [失败]SystemTap和火焰图(Flame Graph)
- application/json 和 application/x-www-form-urlencoded的区别