题目
思路
- 最主要的想法就是,除法其实就是多次减法,所以,把除法改成了减法,每减去1次,则商加1(商初始为0)。
- 但是,这样子超时了…
- 所以,接下来就干脆,每次循环减去两次除数,商+2
- 剩下的都是边界值的情况,见代码
代码
#include<iostream>
#include<cmath>
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… 还是需要再优化或者换方法