整理来源: http://bbs.csdn.net/topics/390511135
(由于0^0有争议,在这儿取0^0=0)
// 依次乘以n次x的值得到最终结果
double Power1(double x, int n) // 循环乘以n,特殊情况,考虑n的正负
{
if (x == 0 || x == 1) // 如果x为0或者-1直接返回x
return x;
int number = n > 0 ? n : -n; // 将n的绝对值返回给number
double result = 1;
for (int i = 1; i <= number; i++) // 循环number,将x的number次幂存入result
result *= x;
if (n > 0) // 如果n为正数,直接输出结果result
return result;
else // 如果n为负数,输出result的相反数
return 1 / result;
}
// 按照n的二进制值,依次判断是否为1,然后分别乘以x, x^2, x^4, ... 得到最终结果
double Power2(double x, int n) // 循环乘以n,特殊情况,考虑n的正负
{
if (x == 0 || x == 1) // 如果x为0或者-1直接返回x
return x;
int number = n > 0 ? n : -n; // 取n的绝对值返回给number
double temp_x = x;
double result = 1; // 初始化计算结果变量为1
while (number) // 当number不为0,循环下面的操作
{
if (number&1) // 如果number最后一位为1,即number对2取余后剩下1
result *= temp_x; // result乘以当前x的幂次方
temp_x *= temp_x; // temp_x取它平方值
number = number >> 1; // number二进制右移一位,进入下一次循环
}
if (n > 0) // 如果n为正数,直接输出结果result
return result;
else // 如果n为负数,输出result的相反数
return 1 / result;
}
// 用递归的方法,实现Power(x, n) = Power(x, n/2) * Power(x, n/2) 【* x】,如果n是奇数多乘以一个x
double Power3(double x, int n) // 循环乘以n,特殊情况,考虑n的正负
{
if (0 == x || 1 == x || 1 == n) // 如果x为0或者1,或者n为1,直接返回x本身
return x;
if (0 == n) // 当n=0时,直接返回1
return 1;
double half = Power3(x, n/2); // 计算x的n/2幂方
if (0 == n % 2) // 当n为偶数,返回x的n/2幂方的平方
return half * half;
else if (n > 0) // 当n为奇数且n为正数,返回x的n/2幂方的平方乘上x
return half * half * x;
else
return half * half / x; // 当n为奇数且n为正数,返回x的n/2幂方的平方乘上1/x
}