29. Divide Two Integers
2016-01-10 19:47
344 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
不用乘、除、取模做除法。
假设y/x,结果可以表示为(2^i+2^j+…..)*x = y的组合,先找到最大的(2^j)*x <= y,然后更新y = y - (2^j)*x,继续寻找2^i直至y < x.
有可能溢出,所以把所有int都转换成long
If it is overflow, return MAX_INT.
不用乘、除、取模做除法。
假设y/x,结果可以表示为(2^i+2^j+…..)*x = y的组合,先找到最大的(2^j)*x <= y,然后更新y = y - (2^j)*x,继续寻找2^i直至y < x.
有可能溢出,所以把所有int都转换成long
public class Solution { public int divide(int dividend, int divisor) { if(divisor == 0) return Integer.MAX_VALUE; if(dividend == 0) return 0; int flag = 1; if(dividend > 0 && divisor < 0 || dividend < 0 && divisor > 0 ) flag = -1; //负数 //防止溢出,所有int都转换成long long dy = Math.abs((long)dividend); long dx = Math.abs((long)divisor); if(dx > dy) return 0; long result = 0; //(1+2+4+....+2^n) * dx = dy //这个过程相当于二分查找 while(dx <= dy){ long k = 1; long tmp = dx; while((dx << 1) <= dy){ dx = dx << 1; //相当于dx*2 k = k << 1; } result += k; dy -= dx; dx = tmp; } result = result*flag; if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) return Integer.MAX_VALUE; //溢出 return (int)result; } }
相关文章推荐
- iOS 开发的技巧
- 第8课:彻底实战详解使用IDE开发Spark程序
- LeetCode--word Pattern
- J2EE之13中规范初了解
- struts2环境配置以及配置xml文件智能提示
- C语言数据结构——队列
- Java高效并发
- Linux最小化安装,忘记安装开发工具的解决方法
- JAVA中indexOf函数和lastindexOf函数
- 通过串口连接树莓派ssh
- 杭电 HDU 5596 (详解)GTW likes gt(思维)
- gulp工具
- AndroidStudio 已确认快捷键, 选择Keymaps: Mac OS X 10.5+
- HBase 笔试题
- <LeetCode OJ> 242. Valid Anagram
- Node.js Express4.x生成程序骨架
- sicily 1006. Campus_mothod_2(Dijkstra算法)
- linux笔记 第13天 系统启动流程、Grub详解、case函数
- 大型网站技术-2. 云计算之OpenStack简述
- python学习之使用multiprocessing.dummy多线程爬虫