题目
给定两个整数,被除数 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。
分析
不可以直接用除法乘法,看了眼解题报告可以用位运算,i<<1表示i*2,i>>1表示i/2,注意溢出情况,溢出情况也就被除数位Integer.MIN_VALUE除数为+-1的时候。
代码
class Solution {
public int divide(int dividend, int divisor) {
long udividend = dividend > 0 ? dividend : (long) -1 * dividend;
long udivisor = divisor > 0 ? divisor : (long) -1 * divisor;
if(udivisor == 1)
if (dividend > 0 && divisor > 0 || (dividend < 0 && divisor < 0))
return udividend > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)udividend;
else return (int) (-1 * udividend) ;
if (udividend == udivisor)
if (dividend > 0 && divisor > 0 || (dividend < 0 && divisor < 0)) return 1;
else return -1 ;
else if (udividend < udivisor) return 0;
int reslut = 0;
while(udividend > udivisor){
long s = udivisor;
int count = 1;
while (udividend >= (s << 1)){
s = s << 1;
count = count << 1;
}
reslut += count;
udividend -= s;
}
if (dividend > 0 && divisor > 0 || (dividend < 0 && divisor < 0)) return reslut;
else return reslut * -1 ;
}
}
以后不在晚上写算法了,眼睛疼,不好好写报告。