博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode--Divide two integers
阅读量:6680 次
发布时间:2019-06-25

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

1.题目描述

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

2.解法分析

不用乘除求模运算,一个很容易让人想到的就是用减法,自然这种算法很费时间,实际上写出一个这样的算法试了一下,TLE。于是剩下的很容易被想到的就是位运算了,这个是基于这样一个观察:

假设除数为B,被除数为A,则有 A = 2k*B+2l*B…(其中k>l 且 2k*B<=A <2k+1*B)

class Solution {
public:
int divide(int dividend, int divisor) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(divisor==0)return INT_MAX;
 
long long absDividend=abs((double)dividend);
long long  absDivisor=abs((double)divisor);
 
long long result=0;
 
long long maxExpOf2=absDivisor;
long long curResult=1;
while(absDividend>=absDivisor)
{
while(absDividend>=(maxExpOf2<<1))
{
maxExpOf2=maxExpOf2<<1;
curResult=curResult<<1;
}
 
absDividend-=maxExpOf2;
result+=curResult;
maxExpOf2=absDivisor;
curResult=1;
 
}
 
 
if((dividend>0&&divisor>0)||(dividend<0&&divisor<0))return result;
else return -result;
 
}
};

 

有了这个思路之后实现起来代码很容易,但是有几个问题需要注意:

  • abs函数里面一定要先对里面待转换的参数显式转换一下,否则当参数的二进制表达最高位为1时转换无用
  • 为防止溢出,要将类型提升到long long ,如果为了节省空间,可以将类型改为unsigned

转载于:https://www.cnblogs.com/obama/p/3280154.html

你可能感兴趣的文章
Shell笔记8——for和select循环的应用实践
查看>>
命令执行常用命令
查看>>
Oracle12c 安装
查看>>
DX11之D3DXMatrixIdentity 函数
查看>>
四项重要标准 让金融机构评选合适的DDoS防护提供商
查看>>
子集生成
查看>>
mybatis 关联子查询 association
查看>>
MySQL大表优化方案
查看>>
文件 / I/O重定向 / 用户和用户组
查看>>
iOS开发的插件和工具
查看>>
IOS开发之----Category的使用
查看>>
设置UIButton,UITextFild边框圆角(上半边或下半边)
查看>>
Python __init__.py 文件使用
查看>>
Spring源码-IOC容器(五)-Bean的初始化
查看>>
zookeeper原理
查看>>
我的友情链接
查看>>
有监视哨的顺序查找
查看>>
微信小程序开发之表单验证(WxValidate使用)
查看>>
Oracle DataBase 各种版本资源路径汇总
查看>>
linux文件中的目录的理解
查看>>