剑指offer——数值的整数次方

来源:互联网 发布:ubuntu jdk 安装 编辑:程序博客网 时间:2024/06/05 18:42

1. 题目描述

  给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

2. 题目分析

  最首先想到的是暴力破解的方法,即

float ans = 1.0;for(int i = 1;i<=n;i++){    ans *= base;}

但是貌似暴力破解的方式看起来不太文明。所以转念就想到了递归。举个例子说明:
Power(2,4)=16=Power(2,2)*Power(2,2)=[Power(2,1)xPower(2,1)]x[Power(2,1)xPower(2,1)]=[2x2]x[2x2]=16
  那么就要考虑两种情况了,一种就是exponent是2的整数倍,另一种是exponent不是2的整数倍。情况一,可以使用例子中的递归方式;情况二,可以先对exponent-1使用例子中的递归方式,然后再给结果乘上一个base即可。
  那么就要考虑两种情况,即递归的初始值:exponent=0和exponent=1时Power的取值。
  另外,该题目还要考虑到当exponent<0的情况。数学上,此时
    Power(base,exponent)=1/Power(base,-exponent)
那么这里需要注意的一个问题是,在除法计算时,如何保留小数的精准度。
  C++中,要计算2个double类型相除结果,如61/387,应得到0.15xxxxx,直接用“/”计算结果却为0.00000。原因是“/” 运算会自动将结果四舍五入,所以要得到精确的除法结果,只需将其中一个数转为float:(float)61/387;
  分析了这么多之后,就可以快快乐乐的写程序了。

class Solution {public:    double Power(double base, int exponent) {        //定义一个double变量来保存最终结果        double ans = 0.0;        //当exponent < 0的时候,取倒数        if (exponent < 0) {            exponent = 0 - exponent;            return float(1.0)/Power(base,exponent);        }        if (exponent == 0)            return 1;        if (exponent == 1)            return base;        //对所求的值使用递归计算        while(exponent > 1) {            if (exponent % 2 == 0) {                exponent = exponent/2;                ans = Power(base,exponent) * Power(base,exponent);                return ans;            }            else {                exponent = (exponent-1)/2;                ans = Power(base,exponent) * Power(base,exponent) * base;                return ans;            }        }        return ans;    }};