美文网首页剑指offer
数值的正数次方

数值的正数次方

作者: G_uest | 来源:发表于2019-08-09 20:19 被阅读0次

    题目来源:牛客网--数值的正数次方

    题目描述

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

    解题思路

    第一次我使用的是 Math.pow() ,看了评论区决定使用快速幂二刷。

    记录一下使用快速幂的题解,关于快速幂,建议百度一下。
    这里说一下几种情况:

    1. 底数为 0,指数为负。因为分母不能为 0 ,异常结束。
    2. 底数为 0,指数非负。结果为 0。
    3. 底数非 0,指数为正,正常使用快速幂进行运算。
    4. 底数非 0,指数为负,先把指数变成正数,因为这样就不用考虑移位时符号位的问题,最终结果做一下倒数运算就好了( 1/result)。
    5. 底数非 0,指数为 0,结果为 1。

    java代码

    public class NumericalIntegerPower {
        public static void main(String[] args) {
            System.out.println(poewr(0, -2));
        }
    
        static double poewr (double base, int exponent) {
            double result = 1;
            int n;
            // 分母为 0 ,抛出异常。
            if (base ==0 && exponent < 0) {
                throw new ArithmeticException();
            }
            // 0 的任何次幂都为 0
            if (base == 0) {
                return 0;
            }
            // 一个数的 正数 次幂
            if (exponent > 0){
                n = exponent;
            } else if(exponent < 0) { // 一个数的 负数 次幂
                // 先按正数次幂算,这样移位时就不用考虑符号问题。最后 1/result 就好了
                n = -exponent;
            } else { // 一个数的零次幂
                return 1;
            }
            // 快速幂 运算
            while (n != 0) {
                if ((n & 1) != 0) {
                    result *= base;
                }
                base *= base;
                n >>= 1;
            }
            return exponent > 0 ? result : 1/result;
        }
    }
    

    相关文章

      网友评论

        本文标题:数值的正数次方

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