题目描述
给定两个整数,被除数 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
此题考点:
1:整数范围限制,需要对结果进行处理,超出范围返回2^31
2:如何比较好的处理能不超时,简单的减法思路肯定是会超时的
3:计算过程中如何处理负数问题,当两数字皆为负数或非负数则结果为正,否则为负
我的解法
利用小学学到过的知识:除法的竖式原理进行求解即可。
除法竖式原理:百度百科
代码
/**
* @param {number} dividend
* @param {number} divisor
* @return {number}
*/
var divide = function(dividend, divisor) {
// 最基本的除法原理实现,小学除法竖式
if(divisor===1){
if(dividend<-2147483648||dividend>2147483647){
return 2147483647;
}
}
var dividendStr = dividend + '',
rs = 0,
temp,
num = 0,
char = '';
if(dividend<0){
char = char===''?'-':'';
dividendStr = dividendStr.substring(1);
}
if(divisor<0){
char = char===''?'-':'';
divisor = -divisor;
}
for(var i=0;i<dividendStr.length;){
while(num===0&÷ndStr[i]==='0'&&i<dividendStr.length){
rs = multi(rs,10);
num=+dividendStr[i++];
}
if(i>=dividendStr.length){
break;
}
while(num<divisor&&i<dividendStr.length){
num=multi(num,10)+ +dividendStr[i++];
rs = multi(rs,10);
}
temp = division(num,divisor);
rs += temp[0];
num = temp[1];
}
if(+(char+rs)<-2147483648||+(char+rs)>2147483647){
return 2147483647;
}else{
return +(char+rs);
}
};
var multi = function(m,n){
var i=0,
rs = m;
while(i++<n-1){
rs+=m;
}
return rs;
}
var division = function(m,n){
var rs = [0,0],
temp = m;
while(temp>=n){
rs[0]++;
temp-=n;
}
rs[1] = temp;
return rs;
}