剑指Offer #12 数值的整数次方(快速幂)

题目来源:牛客网-剑指Offer专题
题目地址:数值的整数次方

题目描述

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

保证base和exponent不同时为0

题目解析

像这种求 a n a^n an 的题目,第一时间想到的必须是快速幂,时间复杂度 O ( l o g n ) O(logn) O(logn) 妥妥的,别再用那种 O ( n ) O(n) O(n) 算法了。

如果不会快速幂的小伙伴,推荐看看这篇文章: 数论基础之快速幂(详细教程)

当然,这道题还没有那么简单,和我们平时做的数论题目不一样的是,这里的 n n n 有可能是负数
n n n 为正数,则 − n -n n 为负数,我们就可以做如下简单处理:
a − n = ( a n ) − 1 a^{-n}=(a^n)^{-1} an=(an)1
我们先求出 a n s = a ∣ n ∣ ans=a^{|n|} ans=an

  • 如果 n n n 为正数,则 a n s ans ans 就是最终答案;
  • 如果 n n n 为负数,则最终答案为 a n s − 1 ans^{-1} ans1

代码如下:

public class Solution {
    public double Power(double base, int exponent) {
        int n = Math.abs(exponent);
        double ans = 1;
        while (n != 0) {
            if (n % 2 == 1) {
                ans *= base;
            }
            base *= base;
            n /= 2;
        }
        return exponent > 0 ? ans : (1 / ans);
    }
}

如果只是为了通过的话,你也可以用下面这种没有灵魂的写法:

public class Solution {
    public double Power(double base, int exponent) {
        return Math.pow(base, exponent);
    }
}

如果本文对你有所帮助,要记得点赞哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值