【LeetCode 29】Divide Two Integers
2015-07-24 17:00
501 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题意:
实现除法,但不允许用乘、除、以及取模运算。
思路:
一下一下减必然显得很low,事实上可以第一次用 dividend 减 divisor,第二次用 dividend - divisor 减 2 * divisor,第三次用 dividend - 3 * divisor 减 4 * divisor... 直到减不下去了,那么此时再乖乖的用dividend - (x = 1+2+4+...+2^n) * divisor 减 divisor,dividend - (x+1) * divisor 减 2 * divisor... 循环往复,计好数就ok啦。这道题有个特殊的trick,网上很多accept的代码我再提交已经过不去了(很好奇当年他们怎么过的。。。),只能默默地手动判断了。
C++:
If it is overflow, return MAX_INT.
题意:
实现除法,但不允许用乘、除、以及取模运算。
思路:
一下一下减必然显得很low,事实上可以第一次用 dividend 减 divisor,第二次用 dividend - divisor 减 2 * divisor,第三次用 dividend - 3 * divisor 减 4 * divisor... 直到减不下去了,那么此时再乖乖的用dividend - (x = 1+2+4+...+2^n) * divisor 减 divisor,dividend - (x+1) * divisor 减 2 * divisor... 循环往复,计好数就ok啦。这道题有个特殊的trick,网上很多accept的代码我再提交已经过不去了(很好奇当年他们怎么过的。。。),只能默默地手动判断了。
C++:
class Solution { public: int divide(int dividend, int divisor) { if(dividend == 0 || divisor == 0) return 0; //特殊判断,超过最大值应返回MAX_INT if(dividend == -2147483648 && divisor == -1) return 2147483647; long long a = abs(static_cast<long long>(dividend)); long long b = abs(static_cast<long long>(divisor)); long long ret = 0; while(a >= b) { long long c = b; for(int i = 0; a >= c; i++) { a -= c; c <<= 1; ret += 1 << i; } } return ((dividend ^ divisor) >> 31) ? (-ret) : (ret); } };
相关文章推荐
- C# FileSystemWatcher 在监控文件夹和文件时的用法
- 日志文件锁定问题
- MATLAB常用1
- 百度云推送ios没收到信息怎么破
- php database search
- 计算两段yuv格式视频流中每一帧的psnr值
- 日志文件锁定问题
- hdu1879 继续畅通工程(最小生成树)
- 024.KVO 键值监听
- 腐蚀与膨胀
- iOS中的屏幕适配之Autolayout(初级)
- Unity之机器人AI
- number_format函数的使用
- Islands and Bridges(POJ 2288状压dp)
- 五毛的cocos2d-x学习笔记01-创建项目
- 移植 DHCP 客户端 到ARM
- 解线性方程组的直接方法(1):杜利特尔LU分解MATLAB实例
- lua加载csv文件
- MyBatis快速入门
- 多线程下HashMap形成死循环,CPU接近100%