LeetCode29DivideTwoIntegers--In Java
2016-02-22 20:24
423 查看
主要采用的方法是:先不断通过移位操作找到divisor最接近dividend的倍数,如被除数是100,除数是3的话,这个倍数就是32。
然后用100减去3的32倍,这里的32倍是通过左移产生,并没有用到乘法。
这时,再用一个循环找到3的多少倍最接近于100和它32倍的差,即找到最接近于4的倍数,通过不断试探16倍,8倍,4倍。。。(通过右移),结果是1倍,为3。
再重复做差的动作,去找最接近1的3的倍数,当然是0倍。最后当做差的值小于3的一倍时,循环退出。
为了解决溢出的问题,参考了/article/5096783.html的方法,用long来进行运算,最后判定不溢出时再转换为int。
然后用100减去3的32倍,这里的32倍是通过左移产生,并没有用到乘法。
这时,再用一个循环找到3的多少倍最接近于100和它32倍的差,即找到最接近于4的倍数,通过不断试探16倍,8倍,4倍。。。(通过右移),结果是1倍,为3。
再重复做差的动作,去找最接近1的3的倍数,当然是0倍。最后当做差的值小于3的一倍时,循环退出。
为了解决溢出的问题,参考了/article/5096783.html的方法,用long来进行运算,最后判定不溢出时再转换为int。
public int divide(int dividend, int divisor) { long m = dividend; long n = divisor; long absn = Math.abs(n); if(divisor==0){ return Integer.MAX_VALUE; } if(dividend==0){ return 0; } boolean flag1 = dividend<0?true:false; boolean flag2 = divisor<0?true:false; m = Math.abs(m); n = Math.abs(n); if(m<n) return 0; long ct = 1;//当前倍数 long tempresult = 0; while((n<<1)<=m){ n = n<<1; ct = ct<<1; } while(true){ tempresult = tempresult + ct; m = m - n; n = n>>1; ct = ct>>1; while(m<n){ n = n>>1; ct = ct>>1; } if(n<absn) break; } if((flag1==true&&flag2==false) || (flag1==false&&flag2==true)) return -(int)tempresult; if(tempresult>Integer.MAX_VALUE) return Integer.MAX_VALUE; return (int)tempresult; }
相关文章推荐
- Spring.Net学习笔记(二)-数据访问器
- java中静态代码块的用法 static用法详解
- Spring源代码解析 ---- 循环依赖
- Android开发遇到eclipse运行程序时报timeout
- 【转】一个不错的eclipse反编译插件
- 第一个Java程序——HolloWorld
- Java多线程Lock对象之ReentrantLock(1)
- java 以行为单位读取txt文件(1)
- Java多线程数量再次说明
- Java语言实现大数字乘除
- Spring中常用类型的bean配置(Map,List,Set,基本类型)
- 使用Java VisualVM监控远程JVM
- java编译器API——使用编译工具
- Java游戏编程原理与实践教程
- 华为机试题: 用小数形式输出指定符号出现的频率(java)
- java 四舍五入保留小数
- spring 2.5 AOP之代理类基础理解
- java平台脚本+java编译器API
- 华为机试题:将十六进制字符串形式内容转为内存值形式(java)
- Java笔记19:Java匿名内部类