
思路一
不能用除法,那就用乘法,设置一个计数器
,然后通过比较
与
的大小,让计数器累加,不满足条件跳出循环即可。先对除数和被除数进行处理,都取绝对值,最后返回结果的时候再处理,因为题目设置的是整数范围,所以为了确保处理的正确性,使用
类型的临时变量。
public static int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
long result = 0;
boolean tag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
tag = false;
}
long temp1 = dividend;
long temp2 = divisor;
if (temp1 < 0){
temp1 = - temp1;
}
if (temp2 < 0){
temp2 = - temp2;
}
while (true){
if (result * temp2 <= temp1){
result++;
}else {
break;
}
}
result -= 1;
if (tag){
if (result > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) result;
}
}else {
if (result < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) -result;
}
}
}
结果超时了。。。。。。。。。。因为如果
的绝对值很小,比如1,而
却很大,比如是Integer.MAX_VALUE,这样时间复杂度就太高了。
思路二
在思路一的基础上进行优化,思路一相当于每次都减
,可以让其成倍的减,第一次减
,下一次就减
,
假设divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n = dividend。那么我们总共只进行了n次操作,这个时间复杂度显然就是O(log(dividend / divisor))。而如果divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n > dividend,但是divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1) < dividend,那么我们就要以dividend - (divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1))为被减数进行重复的操作,即从divisor开始减起。直至我们的被减数小于divisor为止。
public static int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
long result = 0;
boolean tag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
tag = false;
}
long temp1 = dividend;
long temp2 = divisor;
if (temp1 < 0){
temp1 = - temp1;
}
if (temp2 < 0){
temp2 = - temp2;
}
while (temp1 >= temp2){
long k = 1;
long t = temp2;
while (temp1 >= t) {
temp1 -= t;
result += k;
k += k;
t += t;
}
}
if (tag){
if (result > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) result;
}
}else {
if (result < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) -result;
}
}
}
博客介绍了不用除法实现除法运算的两种思路。思路一是用乘法和计数器,通过比较大小累加计数器,但遇到除数绝对值小、被除数大的情况会超时。思路二则在思路一基础上优化,让除数成倍相减,降低了时间复杂度。
553

被折叠的 条评论
为什么被折叠?



