不使用除法运算符的情况下获取商

今天在力扣看到一题,就如题目所说,不用除法实现除法功能。

我当然不会了,除了能想到要用二进制运算符外,没有一点思路,便问了AI。

思路就是,不断找小于被除数的,除数的最大2的幂数。

比如 10/3 因为使用二进制运算符,那么首先来找3乘以2的幂数。

比如3 的二进制为 0011 进行左移1位后,变成 0110 十进制为6,继续左移则变成了12

  • 3乘以2的0次幂 3
  • 3乘以2的1次幂 6
  • 3乘以2的2次幂 12

而12大于了被除数10,所以我们只取2的一次幂,从2的第0次幂开始,总共进行两次运算得到的6,所以我们先记下已经运算了 2次 。

之后,将被除数减去我们计算的刚才的结果6 那么剩余4。

然后继续从头开始计算,发现只有乘以2的0次幂小于4,也就是只有一次,所以继续加上刚才的结果,最终结果为3

public static int df(int a, int b) {

int count = 0;

int less = a;

while (less >= b) {

int currentCount = 0;

for (int i = 0; i <= 31; i++) {

if (b << i > less) {

less -= b << (i - 1);

break;

} else {

currentCount = 1 << i;

}

}

count += currentCount;

}

return count;

}

这里有一点需要解释的就是,currentCount = 1 << i

比如10/3,当循环第二次时,这个b<<(i-1)的值是6,也就是两个3,所以需要获取:

  • i为1时,就是10减去一个3,那么i应该为1,意思是减去了一次
  • i为2时,就是10减去两个3,那么i应该为2,意思是减去两次
  • i为3时,就是10减去三个3,那么i应该为4,意思是减去四次
  • i为4时,就是10减去四个3,那么i应该为8,意思是减去八次

依次类推。

我去,写完后我又想到个更简单的,简单到不用解释

public static int a(int a, int b) {

int temp = 0;

int count = 0;

while (temp < a) {

temp += b;

count++;

}

if (temp > a) {

count--;

}

return count;

}

面试可别这么写,容易被人乱棍打出来。