Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
采用减法代替除法
代码如下:
/*方法一、用减法代替除法*/
/**
dividend: 被除数
divisor: 除数
**/
int divide(int dividend, int divisor)
{
/*1.异常处理*/
if(divisor == 0) {
return 0;
}
int MAXINT = 2147483647;
int MININT = -2147483648;
long long divid = (long long)dividend;//考虑对最大最小整数取模的情况
long long divi = (long long)divisor;
/*避免多次计算,直接返回被除数*/
if(divi == 1) {
return (int)divid;
}
if(divi == -1) {
/*溢出处理-2147483648/-1 = 2147483647 而不是2147483648*/
if (divid <= -MININT) {
return MAXINT;
}
return (int)(-dividend);
}
bool ispositive = true;
/*2.负数处理*/
if(divid<0)
{
divid = -divid;
if(divi < 0) {
divi = -divi;
}
else {
ispositive = false;
}
}
else if(divi<0) {
divi = -divi;
ispositive = false;
}
bool ispositive = true;
/*2.负数处理*/
if(dividend<0)
{
dividend = -dividend;
if(divisor<0) {
divisor = -divisor;
}
else {
ispositive = false;
}
}
else if(divisor<0) {
divisor = -divisor;
ispositive = false;
}
/*3.用减法代替除法*/
while(dividend >= divisor) {
dividend -= divisor;
res++;
}
if(!ispositive) {
res = -res;
}
return res;
}
提交结果是超时。
方法二、采用减法和移位来代替除法(通过)
算法思想如下:分析:题目意思很容易理解,就是不用乘除法和模运算求来做除法,很容易想到的一个方法是一直做减法,然后计数,但是提交之后显示超时,在网上找到一种解法,利用位运算,意思是任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+…+a_n*2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基n的值,说明被除数中至少包含2^n个除数,然后减去这个基数,再依次找到n-1,…,1的值。将所有的基数相加即可得到结果。
/*方法二,用减法和移位代替除法*/
int divide(int dividend, int divisor)
{
/*1.异常处理*/
if(divisor == 0) {
return 0;
}
int MAXINT = 2147483647;
int MININT = -2147483648;
long long divid = (long long)dividend;//考虑对最大最小整数取模的情况
long long divi = (long long)divisor;
/*避免多次计算,直接返回被除数*/
if(divi == 1) {
return (int)divid;
}
if(divi == -1) {
/*溢出处理-2147483648/-1 = 2147483647 而不是2147483648*/
if (divid <= -MININT) {
return MAXINT;
}
return (int)(-dividend);
}
bool ispositive = true;
// printf("[%d] divid %lld!\n",__LINE__,divid);
// printf("[%d] divi %lld!\n",__LINE__,divi);
/*2.负数处理*/
if(divid<0)
{
divid = -divid;
if(divi < 0) {
divi = -divi;
}
else {
ispositive = false;
}
}
else if(divi<0) {
divi = -divi;
ispositive = false;
}
long long res = 0;
long long cnt = 1;
long long temp = 0;
#if 1
while(divi <= divid) {
cnt = 1; /*2^n 次方*/
temp = divi;
/*3.找到大于被除数的基数*/
while(temp <= divid) {
temp <<= 1;
cnt <<= 1;
}
res += (cnt>>1);
/*4.减去基数前一个数*/
divid -= (temp>>1);
}
#endif
if(!ispositive) {
res = -res;
}
return res;
}