标签:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
1.除法转换为加法,加法转换为乘法,y个x相加的结果就是x*y.
假设结果为dividend的一半,用此值与divisor相乘,如果相乘结果大于dividend则,high=dividend,然后继续二分
/** 两个整数相除也可能会溢出,最小负数除以-1就溢出了 */ class Solution { public: long long int multiply(long long x,long long int y) { if(y==1){ return x; } long long int res = multiply(x,y>>1); res = (1&y) ? (res<<1) + x: (res<<1); return res; } int divide(int dividend, int divisor) { long long int l_dividend = fabs(dividend); long long int l_divisor = fabs(divisor); if(l_dividend < l_divisor){ return 0; } if((dividend==INT_MIN && divisor==-1) || divisor==0){ return INT_MAX; } int sign = ((dividend>>31)^(divisor>>31)) ? -1:1; long long int low = 1,high =l_dividend; while(low<=high){ long long int mid = low+((high-low)>>1); long long int res = multiply(l_divisor,mid); if(res == l_dividend){ return mid*sign; }else if(res<l_dividend){ low = mid+1; }else{ high = mid-1; } } return (low-1)*sign; } };
/** 两个整数相除也可能会溢出,最小负数除以-1就溢出了 */ class Solution { public: int divide(int dividend, int divisor) { long long int l_dividend = fabs(dividend); long long int l_divisor = fabs(divisor); if(l_dividend < l_divisor){ return 0; } if((dividend==INT_MIN && divisor==-1) || divisor==0){ return INT_MAX; } int sign = ((dividend>>31)^(divisor>>31)) ? -1:1; int res = 0; while(l_dividend >= l_divisor){ long long int tmp = l_divisor; int occur_times = 0; while(tmp <= l_dividend){ tmp = tmp<<1; occur_times++; } res += (1<<(occur_times-1)); l_dividend -= (tmp>>1); } return res*sign; } };
标签:
原文地址:http://www.cnblogs.com/zengzy/p/5043519.html