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; }