剑指Offer:数值的整数次方Java/Python

1.题目描述

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

2.算法描述

如果直接累乘时间复杂度是 O ( n ) O(n) O(n),调用库函数即可。

讨论下快速幂(时间复杂度为 O ( l o g n ) O(logn) O(logn))是如何解答的。

假如我们需要求的是50的11次方。快速幂是这样计算的。
1.首先, 1 1 10 = 101 1 2 11_{10} = 1011_{2} 1110=10112
2.那么, 5 0 1 1 10 = 5 0 101 1 2 50^{11_{10}}=50^{1011_{2}} 501110=5010112
3.最后快速幂这样计算: 5 0 1011 = 5 0 0001 ∗ 5 0 0010 ∗ 5 0 0000 ∗ 5 0 1000 50^{1011} = 50^{0001}*50^{0010}*50^{0000}*50^{1000} 501011=500001500010500000501000,分别是 5 0 1 , 5 0 2 , 5 0 4 , 5 0 8 , . . . 50^1,50^2,50^4,50^8,... 501,502,504,508,...,而计算这些数的时候,当前的数只需要将之前的数平方即可。所以对指数进行从右到左的扫描,如果对应位置上是1,就把这个被乘数乘到结果中去。然后检查下一位,直到指数为0。

这个题目分三种情况处理:

a)指数大于0。直接运用快速幂计算。
b)指数小于0。如果底数为0,返回错误;如果底数不为0,将指数转为正数,然后运用快速幂计算。返回结果的倒数。
c)指数等于0。返回1。

3.代码描述

3.1.Java代码

public class Solution {
    public double Power(double base, int exponent) {
        int exp = 0;
        double ans = 1;
        if(exponent>0)
            exp = exponent;
        else if(exponent<0){
            if(base==0)
                throw new RuntimeException("分母不能为0");
            else
                exp = -exponent;
        }
        else
            return 1;
            
        while(exp!=0){
            if((exp&1)==1)
                ans *= base;
            base *= base;
            exp >>= 1;
        }
        return exponent>0 ? ans : 1/ans;
  }
}

3.2.Python代码

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        exp = 0
        ans = 1
        if exponent>0:
            exp = exponent
        elif exponent<0:
            if base==0:
                return None
            else:
                exp = -exponent
        else:
            return 1
            
        while exp:
            if (exp&1) == 1:
                ans *= base
            base *= base
            exp >>=1
        return ans if exponent>0 else 1/ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值