29. Divide Two Integers
2016-05-12 18:54
337 查看
Problem
Divide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT.
Solution
参考。在这道题中,要求两个整数的商,但是不能使用除法、乘法和取模操作,所以只能使用位运算。
首先看个例子,15除以3,15是被除数,3是除数。除法就是为了找到从被除数能减去多少个除数,同时不会使结果为负数,也就是找到使得“被除数-除数*n>=0”成立的最大的n。
首先用15-3=12,正数。尝试从15中减去更多,将3左移一位得到6,15-6=9,还是正数。再将6左移一位得到12,15-12=3,还是正数。但是当将12左移一位得到24时,我们知道最多只能减去12。因为12是3通过左移两次得到的,所以12是3的4倍。也就是从1开始,左移两次得到4。我们将4加在返回值上(返回值初始化为0)。现在我们得到商4,余数3,然后我们重复上面的过程。
导致移除的情况有两个:
1. 除数是0
2. 被除数是INT_MIN,同时除数是-1(因为abs(INT_MIN) = INT_MAX+1)。
class Solution { public: int divide(int dividend, int divisor) { //handle overflow if(divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX; int sign = ((dividend < 0) ^ (divisor < 0)) ? -1:1; long long dvd = labs(dividend); long long dvs = labs(divisor); int ret = 0; while(dvd >= dvs) { long long tmp = dvs; long long multiple = 1; while(dvd >= (tmp << 1)) { tmp <<=1; multiple <<=1; } dvd -= tmp; ret += multiple; } return sign == 1?ret:-ret; } };
相关文章推荐
- 剑指offer之面试题50树中两个结点的最低公共祖先
- 论文阅读:Poselet-Based Contextual Rescoring for Human Pose Estimation
- 快速排序
- Flash游戏开发实例①打砖块-2-球的动作建立
- java移位运算符详解
- BZOJ3830: [Poi2014]Freight
- Adam学习18之在window下用eclipse中的maven插件进行编译打包
- NSNumber[将基础的数据类型存储成对象]
- uva10282
- xtrabackup备份脚本
- python pickle模块
- 笔试题53. LeetCode OJ (40)
- 1-6 Tower of Hanoi
- 【译】Java中的枚举
- [Effective JavaScript 笔记] 第7条:视字符串为16位的代码单元序列
- 也来看看hadoop的WordCount
- R语言 常见模型
- nodejs 建站
- Clustering by fast search and find of density peaks 小结
- 原生JS实现tab切换