0 题目
给定一个double类型的浮点数base和int类型的整数exp。求base的exp次方。
1 分析
输入的exp指数可能是负数,base可能是0.但因为是double所以不能用等号判断
另外当,base是个大数的时候,循环处理计算量大。因此采用,先计算exp/2的base次方,然后结果翻倍,再判断exp是否是奇数,如果是奇数,再乘依次base
double Power(double base, int exp)
{
// exp 为0,直接输出 -1
if (exp == 0)
{
return 1;
}
// base 为0 ,直接输出0
if (base < 0.00001 && base > -0.00001)
{
return 0;
}
// 计算
double ret = aux(base, exp > 0 ? exp : -exp);
// 考虑exp为负的情况
if (exp > 0)
{
return ret;
}
else
{
// exp为负,输出他的倒数
return 1 / ret;
}
}
double aux(double base, int exp)
{
if (exp == 0)
{
return 1;
}
// 这里将 exp 分成3部分计算。 也就是 exp/2 ,exp/2 和 exp 是奇数的时候需要除1
double ret = aux(base, exp >> 1);
// 翻倍
ret *= ret;
// 是奇数
if (exp & 0x1)
{
ret *= base;
}
return ret;
}