分析:为什么GOOGLE考这么"简单"的C++题 (写一个函数来计算x的n次方)?
答案1:
int XraisedtoN(int x, int N) {
int result = 1;
for (int i = 0; i < N; i++) {
result = result * x;
}
return result;
}
且慢, 如果 N = 0 或者 N = -2, 答案1死定了.
答案2:
int XraisedtoN(int x, int N) {
if (N == 0) // X^0 = 1
return 1;
int num;
bool negative;
if (N < 0) // handle X^-2 for example
{
num = -N;
negative = true;
}
else {
num = N;
negative = false;
}
int result = 1;
for (int i = 0; i < N; i++) {
result = result * x;
}
if (negative)
return (1/result);
else
return result;
}
且慢, 2^(-2)按照上述答案2计算为1/4永远为零(正解为
if (negative)
return (1.0)/result
答案2也死定了.看似简单的一道题,有很多陷阱(边界条件/特例).
我的答案是:
template // base type T, return type R
R XraisedtoN(T x, int N) {
if ( N == 0 )
return 1; // X^0 = 1
bool negative;
int num;
if ( N < 0 ) {
num = -N;
negative = true;
}
else {
num = N;
negative = false;
}
T result(1); // type is NOT R
for (int i = 0; i < num; i++)
result = result * x;
if (negative)
return (R)( R(1) / result );
else
return (R)result;
}
不过, 我得告诉面试官此解的前提条件是:
The base type T should be convertible to type R, either implicitly or explicitly