题目
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
解法一
思路:直接暴力减法肯定会超时,比如被除数等于232,除数等于1,那么用时就是232,20亿次的运算,好点的CPU也得几秒钟,肯定超时,直接忽略这种做法,但这个思路是可以继承的。
不用每次只是减去除数,而是减去一个2的幂次,不能用乘法运算,但是可以用移位运算来形成2的幂次,然后使用被除数减去2的幂次来加快计算效率,实际执行如下:(search递归函数)
- 被除数 = 除数 * 2a + b
- 满足公式的最大a,然后递归将b作为被除数
- 直到被除数小于除数为止
- 将所有的2a进行求和
另外,为了防止整数溢出的情况,使用了负数进行减法运算。
public class Solution {
public int search(int m,int n)
{
if(m > n) return 0;//当被除数比除数的绝对值还小的时候结束
int k = -1, t = n;
while(m < t && m - t < t)