您的位置:首页 > 其它

leetcode 29:Divide Two Integers

2015-10-15 22:33 429 查看
Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

题目分析:

先说普通处理,想想我们平时的除法是怎么实现的,从最高位向最低位依次向下除,减掉最高位后,递归的求低位的。

再说一下特殊情况,一定要注意边界条件的处理:

1. 除数、被除数为0

2. 除数、被除数可能去负数

3. 最后一个大坑,注意取值范围-2^32-2^32-1,然后也就意味着不能将-2^32转为正值处理,然后我就想着先减掉一部分,不久不会越界,可以转为正值处理了么

具体代码如下:

public int divide(int dividend, int divisor) {
		 //除数等于0,这个好处理
		 if(divisor==0) return Integer.MAX_VALUE;
		 
		 //除数特殊值,也好处理
		 if(divisor==-2147483648)
		 {
			 if(dividend==-2147483648)
				 return 1;
			 else
				 return 0;
		 }
         
		 //除数特殊值,情况比较复杂
		 if(dividend==-2147483648)
		 {
			 //除数等于-1,溢出
			 if(divisor==-1) return Integer.MAX_VALUE;
			 
			 //除数等于1,原值。也可以放在外面统一处理
			 if(divisor==1) return dividend;
			 
			 //因为绝对值溢出了,不能直接用Math.abs()。所以就想着能从绝对值中先减掉一部分
			 //没想到特别好的方法,暂时这样,还是觉得很机智啊
			 else
			 {
				 //除数分正负分开处理
				 if(divisor>0)
				 {
					 return -1-divide(2147483647-divisor+1,divisor);
				 }
				 else
				 {
					 return 1+divide(2147483647-Math.abs(divisor)+1,Math.abs(divisor));
				 }
			 }
		 }
		 
		 //处理符号不一致的情况
		 if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))
			 return 0-divide(Math.abs(dividend),Math.abs(divisor));
		 
		 //处理两个都为负的情况
		 if(dividend<0&&divisor<0)
			 return divide(Math.abs(dividend),Math.abs(divisor));
		 
		 if(dividend==0) return 0;
		 if(divisor==1) return dividend;
		 if(dividend<divisor) return 0;
		 if(divisor==dividend)
			 return 1;
		 
		 //通过移位操作实现除法,要注意不要溢出。就是从最高位开始往下减,递归实现
		 int i=1;
		 int len=getlen(divisor);
		 while(dividend>=(divisor<<i)&&i<32-len)
		 {
			 i++;
		 }
		 //递归实现
		 return (int)Math.pow(2,i-1)+divide(dividend-(divisor<<(i-1)),divisor);
		 
	 }
	 
	 public int getlen(int x)
	 {
		 int len=0;
		 while(x>0)
		 {
			 len++;
			 x=x>>1;
		 }
		 return len;
	 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: