【leetcode】 兩數(shù)相除
題目:
給定兩個整數(shù)领铐,被除數(shù) dividend 和除數(shù) divisor悯森。將兩數(shù)相除,要求不使用乘法绪撵、除法和 mod 運算符瓢姻。
返回被除數(shù) dividend 除以除數(shù) divisor 得到的商。
整數(shù)除法的結(jié)果應(yīng)當截去(truncate)其小數(shù)部分音诈,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:
輸入: dividend = 7, divisor = -3
輸出: -2
解釋: 7/-3 = truncate(-2.33333..) = -2
提示:
被除數(shù)和除數(shù)均為 32 位有符號整數(shù)幻碱。
除數(shù)不為 0。
假設(shè)我們的環(huán)境只能存儲 32 位有符號整數(shù)细溅,其數(shù)值范圍是 [?231, 231 ? 1]褥傍。本題中,如果除法結(jié)果溢出喇聊,則返回 231 ? 1摔桦。
思路:
將除法改為多次減運算,每一次減的數(shù)遞增
java代碼
···
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
long tempDividend = (long) dividend;
long tempDivisor = (long) divisor;
boolean flag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
flag = false;
}
if (tempDividend < 0) {
tempDividend = -tempDividend;
}
if (tempDivisor < 0) {
tempDivisor = -tempDivisor;
}
long result = 0;
while (tempDividend >= tempDivisor) {
long k = 1;
long temp = tempDivisor;
while(tempDividend >= temp) {
tempDividend -= temp;
result += k;
k += k;
temp += temp;
}
}
if(flag) {
if(result > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}else {
return (int)result;
}
}else {
if (-result < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
} else {
return (int) (-result);
}
}
}
}
···