剑指offer-12:数值的整数次方

题目描述

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

思路

个人觉得此题考查的是快速幂算法。

快速幂算法

快速幂 , 矩阵快速幂 在算大指数次方时是很高效的,他的基本原理是二进制。

大家首先要认识到这一点:任何一个整数N,都能用二进制来表示。。
那么对于an , n一定可以用二进制表示,比如a11

在这里插入图片描述

    double fun( double a, int b )
    {
        double r = 1;
        double base = a;
        while( b != 0 )
        {
            if((b&1)==1)//判断奇偶性,为1时才进行运算
            {
                r *= base;
            }
            base *= base;
            b=b>>1;
        }
        return r;
    }

此题代码

public class Solution12 {


    public double Power(double base, int exponent) {
        double res = 1, curr = base;
        int n;
        if (exponent > 0) {
            n = exponent;
        } else if (exponent < 0) {
            if (base == 0)
                throw new RuntimeException("分母不能为0");
            n = -exponent;
        } else {// exponent==0
            return 1;// 0的0次方
        }
        while (n != 0) {//快速幂算法
            if ((n & 1) == 1){
                res *= curr;
            }
            curr *= curr;// 翻倍
            n >>= 1;// 右移一位
        }
        return exponent >= 0 ? res : (1 / res);
    }
    public static void main(String[] args) {
        Solution12 solu = new Solution12();
        System.out.println(String.valueOf(solu.fun(3, 4)));
    }

}

猜你喜欢

转载自blog.csdn.net/u013728021/article/details/84793720