1. 数值的整数次方
a. 不考虑大数情况
#define PRECISION 0.00001
double pow(double base, int exp){
if (equal(base,0))
return 0;
if (exp == 0)
return 1.0;
bool negative = (exp>0)?false:true;
unsigned int exponent;
if (negative == true)
exponent = (unsigned int)-exp;
else
exponent = exp;
double result = powUnsigned (base, exponent);
if (negative == true)
result = 1.0/result;
return result;
}
bool equal(double num1, double num2){
if (abs(num1-num2)<=PRECISION)
return true;
return false;
}
double powUnsigned (double base, unsigned int exponent){
bool odd = exponent%2?false:true;
double result = base;
while(exponent/2){
result *= result;
exponent /=2;
}
if (odd == true)
result *= base;
return result;
}
1, 要考虑exp小于0,等于0的情况
2. 要考虑base为0的情况,由于0的0次方没有意义,返回0/1均可,不过一定要跟interviewee沟通
3. double 很少用 == 情况,一般都有一个精度设定!!!!
4 .
exponent /=2;
除以2,肯定没有位移效率高!!改成位移更好
2. sqrt (x)
Newton method: http://blog.csdn.net/z2008junjie/article/details/5361735
#define ITERATION 1000
double sqrt(double x){
if (x<0)
return -1;
if (equal(x,0))
return 0;
double result = 1;
for(int i = 0; i<ITERATION; i++ )
result = 0.5*(result + x/result);
return result;
}