【剑指offer】12-数值的整数次方

本文系《剑指offer》的刷题记录,通过牛客网在线平台测试通过。
在线测试平台:牛客网
编程资料获取:CodeLab

1-Description

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

2-Solution

这里注意的是需要考虑指数小于0以及底数为0的情况,所以在写代码的时候要尽量保证代码的全面性,下面是解决代码

class Solution {
public:
    double Power(double base, int exponent) {
        double result = 1;
        if(exponent > 0){
            for(int i = 1; i <= exponent; ++i){
                result = result * base;
            }
        }
        else if(exponent < 0){
            for(int i = 1; i <= -exponent; ++i){
                result = result * base;
            }
            result = 1.0 / result;
        }
        return result;
    }
};

注意到求a的n次方可以使用如下的公式:
a n = { a n / 2 ⋅ a n / 2 , n为偶数 a ( n − 1 ) / 2 ⋅ a ( n − 1 ) / 2 ⋅ a , n为奇数 a^n = \begin{cases}a^{n/2}·a^{n/2},&amp;\text{n为偶数} \\ \\a^{(n-1)/2}·a^{(n-1)/2}·a,&amp;\text{n为奇数} \end{cases} an=an/2an/2,a(n1)/2a(n1)/2a,n为偶数n为奇数
而这一公式显然是可以用递归来实现的,所以可以得到如下的代码:

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent < 0) {
            base = 1/base;
            exponent *= -1;
        }
        if(exponent == 0) return 1;
        if(exponent == 1) return base;
        double result = Power(base,exponent >> 1);//右移运算符代替exponent除以2
        result *= result;
        if(exponent & 0x01 == 1) result *= base;//位于运算符代替求余运算符(%)判断奇偶
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值