LeetCode 29题:两数相除

题目

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的  。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

提示:

  • -231 <= dividend, divisor <= 231 - 1
  • divisor != 0

思路 

这道题我是将除法转化为减法,如:

LeetCode 29题:两数相除_第1张图片

将被除数分为 n 个除数。

这样要求我们先对结果的正负进行判断,然后对除数与被除数取绝对值进行减法。

为了加快速度,令 d= 除数 b ,将 d 每次与被除数 a/2 比较后乘以2,再进行比较,用 c 代表此时的d = c * b

代码

#include 
#include 
#include 

int divide(int dividend, int divisor);

int main()
{
    int a = 2147483647;
    int b = 1;
    int c = divide(a, b);
    printf("%d", c);
}

int divide(int dividend, int divisor)
{
    int res = 0;
    int sign = 1;
    if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
        sign = -1;
    if (divisor == INT_MIN)
    {
        if (dividend == INT_MIN)
            return 1;
        else
            return 0;
    }
    if (dividend == INT_MIN)
    {
        if (divisor == 1)
            return INT_MIN;
        else if (divisor == -1)
            return INT_MAX;
        res++;
        dividend = dividend + fabs(divisor);
    }
    int a = fabs(dividend);
    int b = fabs(divisor);
    while (a >= b)
    {
        int c = 1;
        int d = b;
        while (a/2 >= d)// a/2 是为了防止 2*d >INT_MAX 同时 a >= 2*d,为后面做准备
        {
            d = 2 * d;
            c = 2 * c;
        }
        a = a - d;//c 指 d 代表 c 个 b
        res = res + c;
    }
    if (sign == -1)
        res = -res;
    return res;
}

你可能感兴趣的:(LeetCode练习题,leetcode,算法,c语言)