#include <bits/stdc++.h>
using namespace std;
/**
* @brief
* 输入两个int类型的整数,它们进行除法计算并且返回商,要求不得使用乘号‘*’,
* 除号‘/’,以及求余符号‘%’。当发生溢出时,返回最大的整数值。
* 假设除数不为0.例如,输入15和2,输出15/2的结果,7;
* @return int
*/
/**
*思路:
第一:与除数比,如果被除数比除数大,除数*2
第二,继续比,直到被除数小于除数的二倍,记录此刻的倍数
第三。被除数减去之前的除数累乘的结果,用结果继续重复以上过程
*/
int divideCore(int dividend, int divisor){
int result = 0;
// 这里由于把除数与被除数都变为了负数,所以与正数时比较刚好相反
//大就是小,小就是大
while (dividend <= divisor){
int value = divisor;
int quotient = 1;
// 0xc0000000 为最小int整数值的一半,value 如果小于INT_MIN的一半的话,
//就说明商最多为1
// 如果dividend > value + value 就该下一轮了
while (value >= 0xc0000000 && dividend <= value + value)
{
quotient += quotient;
value += value;
}
result += quotient;
dividend -= value;
}
return result;
}
int divide(int dividend, int divisor){
//处理溢出的情况,因为INT最小的值的绝对值要比INT最大值要大1,
//故如果运算情况如下,会导致溢出
if(dividend == INT_MIN && divisor == -1){
return INT_MAX;
}
//该变量是标识,除数与被除数的负数数量;
//为偶,最后结果为正,为奇,最后结果为负
int negative = 2;
if(dividend > 0){
negative --;
dividend = -dividend;
}
if(divisor > 0){
negative --;
divisor = -divisor;
}
int result = divideCore(dividend, divisor);
return negative == 1? -result : result;
}
int main(){
int dividend, divisor;
cin >> dividend >> divisor;
int result = divide(dividend, divisor);
cout << result << endl;
system("pause");
return 0;
}
剑指offer第一题-整数除法
最新推荐文章于 2023-02-26 20:53:33 发布