29. Divide Two Integers
来源:互联网 发布:怎么成为java高级编程 编辑:程序博客网 时间:2024/05/18 15:56
题目:Divide Two Integers
原题链接:https://leetcode.com/problems/divide-two-integers/
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
模拟除法,不能使用乘法,除法或者取余运算符。
如果溢出,则返回INT_MAX.
使用位运算来模拟除法。
为了便于处理,首先除数和被除数都取绝对值并且转化成long long型。
首先看一种最原始的方法模拟除法,不断的把被除数减去除数,一直到被除数小于除数为止,这种方法有效但是效率不高,我们可以想办法加快这个过程。
我们可以不需要每次只减去一个除数,可以直接将除数左移(这样就是把除数乘以2,乘以4,乘以8。。。)一直到逼近被除数为止,这样可以一次性减去除数乘以(2^n),能够大大的提高效率,然后循环这一过程,直到被除数小于除数为止。
那么,如何得出结果呢?只要每次加上除数所叠加的倍数(即2^n)就可以了。
溢出的情况有两种,第一种是除数为0,第二种是当被除数是INT_MIN并且除数是-1的时候,这种情况下结果比INT_MAX大1,也是超出了范围的。
代码如下:
class Solution {public: int divide(int dividend, int divisor) { if(!divisor || (dividend == INT_MIN && divisor == -1)) return INT_MAX; bool flag = ((dividend < 0) ^ (divisor < 0)) ? false : true; int ans = 0; long long td = labs(dividend), ts = labs(divisor); while(td >= ts) { long long temp = ts, cnt = 1; while(td >= (temp << 1)) { temp <<= 1; cnt <<= 1; } td -= temp; ans += cnt; } return flag ? ans : -ans; }};
0 0
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 在asp网页中,只刷新iframe子页面中的内容,并传值过去,怎么实现呀!
- Android连接服务器相关问题
- SPOJ-COLONY - Linearian Colony!简单二分思想
- Java线程常见概念——基本概念、可见性、同步
- oracle9i客服端连接服务器
- 29. Divide Two Integers
- github仓库命令行下的使用-ubuntu系统
- Android 运行时权限高阶--封装(听课笔记)
- android 滑动冲突问题
- Android 类似手机接收到短信桌面图标改变
- python列表去重的两种方法
- Java线程
- DIV如何JS调用广告!!!
- 2016总结及2017计划