美文网首页数据结构&算法&人工智能
剑指offer编程题—数值的整数次方

剑指offer编程题—数值的整数次方

作者: 零岁的我 | 来源:发表于2020-02-26 21:51 被阅读0次

题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
四种题解:

#include<iostream>
#include<cmath>
using namespace std;

//1. 直接调用库函数
double Power1(double base, int exponent)
{
   return pow(base,exponent);
}
//2. 暴力法
double Power2(double base, int exponent)
{
    if(base==0){
        return 0.0;
    }
    double result=1.0;
    int exp;
    exp=exponent>0?exponent:-exponent;
    while(exp){
        result *=base;
        --exp;
    }
    return exponent>0?result:1/result;
}

//3. 位运算
/*base=2.0 exponent=5
2^5=2^(101)=2^(2^2+2^0)=2^(4+1)=2^4*2^1
结果值 result 初始为 1.0
假设base 初始为2.0,此时exponent的二进制最右位为 1,更新结果为:base*result
exponent右移一位。base进行累乘,base更新为2的2次方。由于exponent的二进制最右位为0,不更新结果
exponent右移一位。base进行累乘,base更新为2的 4次方。此时exponent的二进制最右位为1,更新结果为:base*result
结束
*/
double Power3(double base,int exponent)
{
    if(base==0){
        return 0.0;
    }
    int exp=exponent>0?exponent:-exponent;
    double result=1.0;
    while(exp){
        if(exp&1==1){
           result *= base;
        }
        exp=exp>>1;
        base *= base;
    }
    return exponent>0?result:1/result;
}
//4. 二分法
/*
如果exponent是偶数,Power(base, exponent) = Power(base, exponent / 2) * Power(base, exponent / 2)
如果exponent是奇数,Power(base, exponent) = base * Power(base, exponent / 2) * Power(base, exponent / 2)
对于负指数exponent的情况,取其绝对值先计算。将最后结果取倒数即可。
*/
double Power4(double base,int exponent)
{
    int flag;
    flag=exponent>0?1:0;
    exponent=abs(exponent);
    if(exponent==0){
        return 1.0;
    }
    if(exponent==1){
        return flag>0?base:1/base;
    }
    if(base==0)
        return 0.0;
    double result= exponent%2 ? base*Power4(base,exponent/2)*Power4(base,exponent/2):Power4(base,exponent/2)*Power4(base,exponent/2);
    return flag>0? result:1/result;
}

int main(int argc,char **argv)
{
    double b=2.0;
    int exp=-1;

    cout<<Power1(b,exp)<<endl;
    cout<<Power2(b,exp)<<endl;
    cout<<Power3(b,exp)<<endl;
    cout<<Power4(b,exp)<<endl;

    cout<<Power2(0.0,0)<<endl;
    cout<<Power2(2.0,0)<<endl;
    cout<<Power3(2.0,-5)<<endl;
    cout<<Power4(2.0,5)<<endl;

    return 0;
}

运行结果

欢迎点赞!

相关文章

网友评论

    本文标题:剑指offer编程题—数值的整数次方

    本文链接:https://www.haomeiwen.com/subject/eqcgchtx.html