【题目】
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目的意思就是:不使用*、/、%运算符进行除法运算
【思路】
这道题最直接的想法,就是被除数每次减去除数,计算减了多少次,即为所求。但是这个办法的效率太低,试想被除数是Integer.MAX_VALUE(2147483647),除数是1,则要减2147483647次,很明显会发生TLE。
更好的方法:
不是每次减去除数,而是每次减后除数*2,结果每次累加除数的相应的倍数。
【代码】
public class P029_DivideTwoIntegers {
public int divide(int dividend, int divisor) {
int sign = 1;
if (dividend < 0) {
sign = -sign;
}
if (divisor < 0) {
sign = -sign;
}
long n1 = Math.abs((long)dividend);
long n2 = Math.abs((long)divisor);
long ans = 0;//用long是为了处理溢出,比如当ans为2147483648的情况
while (n1 >= n2) {
long base = n2;
for (int i = 0; n1 >= base; i++) {
n1 -= base;
base<<=1;
ans+=1<<i;
}
}
//处理溢出的情况
//int的范围为-2147483648到2147483647
//dividend=Integer.MIN_VALUE,即-2147483648
//divisor=-1,此时将发生溢出,按题目要求,返回Integer.MAX_VALUE
if (ans * sign > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
return (int) (sign*ans);
}
}
时间: 2024-11-10 07:48:33