有做浏览单的网站百度收录是什么意思
题目
给你两个整数,被除数 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
思路
这道题我是将除法转化为减法,如:
将被除数分为 n 个除数。
这样要求我们先对结果的正负进行判断,然后对除数与被除数取绝对值进行减法。
为了加快速度,令 d= 除数 b ,将 d 每次与被除数 a/2 比较后乘以2,再进行比较,用 c 代表此时的d = c * b
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>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;elsereturn 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 个 bres = res + c;}if (sign == -1)res = -res;return res;
}