解题思路:
1. 类似二分法:每次左移divisor 一位。
2. 用log(a-b)=loga/logb
注意:overflow, underflow, 并且要考虑符号问题
public int divide(int dividend, int divisor) { if(dividend == 0 || divisor == 1) return dividend; int sign = 1; if(dividend < 0) sign *= -1; if(divisor < 0) sign *= -1; long dvd = Math.abs((long)dividend); //the overflow and underflow long dvs = Math.abs((long)divisor); int result = 0; int i = 0; while(dvd >= dvs){ dvs <<=1; i++; } while(dvd < dvs && i > 0){ i--; dvs >>= 1; if( dvd >= dvs ){ result += 1 << i; dvd -= dvs; } } return sign*result; }
以下为log的方法,由于在java里,double并不是准确的值,有一定的误差。所以最后的结果要有一个误差的调整。
public int divide(int dividend, int divisor) { if(dividend == 0 || divisor == 1) return dividend; int sign = 1; if(dividend < 0) sign *= -1; if(divisor < 0) sign *= -1; if(dividend==Integer.MAX_VALUE&&divisor==Integer.MIN_VALUE) return 0; else if(dividend==Integer.MIN_VALUE&&divisor==Integer.MAX_VALUE) return sign < 0? -1:1; dividend = Math.abs(dividend); divisor = Math.abs(divisor); double t = Math.log10(dividend) - Math.log10(divisor); double ret = Math.pow(10, t); int result = (int) Math.floor(ret+ 0.0000001); return sign*result; }
No comments:
Post a Comment