力扣29两数相除C++

题目

请点击

思路

  • 最主要的想法就是,除法其实就是多次减法,所以,把除法改成了减法,每减去1次,则商加1(商初始为0)。
  • 但是,这样子超时了…
  • 所以,接下来就干脆,每次循环减去两次除数,商+2
  • 剩下的都是边界值的情况,见代码

代码

#include
#include
using namespace std;
int divide(int dividend, int divisor) {
    int sym=1;//符号。若被除数与除数中有一个为负,则sym=-1
    long int quotient=0;//使用long int的原因在于防止计算过程中溢出
    long int divid = dividend;
    long int divi = divisor;

    if(divid == 0) return 0;//若被除数为0,则商为0
    //被除数可表示正负最大,除数为正负1时,的边界值情况
    if( (divid <= -2147483648 && divi==-1) || (divid >= 2147483647 && divi==1) ) return 2147483647;
    if( (divid <= -2147483648 && divi==1) || (divid >= 2147483647 && divi==-1) ) return -2147483648;

    if(divid<0){//将负的被除数,变成正的
        divid = -divid;
        sym = -sym;
    } 
    if(divi<0){//将负的除数,变成正的
        divi = -divi;
        sym = -sym;
    }

    while(divid >= (divi + divi)){//每次循环减去两次除数,则商每次需要+2
        divid = divid - (divi + divi);
        quotient = quotient + 2;
    }
    if(divid >= divi){//最后,可能只够减去1个除数,商+1
        divid -= divi;
        quotient += 1;
    }
    
    if(sym!=1) quotient = -quotient;
    
    return quotient;
}
int main(){
    int dividend, divisor;
    cin>>dividend>>divisor;
    long int quotient = divide(dividend, divisor);
    cout<<quotient<<endl;
    return 0;
}

but,这样子,用时直接1296ms… 还是需要再优化或者换方法

你可能感兴趣的:(力扣,leetcode)