美文网首页
《剑指offer》(十二)-数值的整数次方(java)

《剑指offer》(十二)-数值的整数次方(java)

作者: 鼠小倩 | 来源:发表于2019-11-14 12:14 被阅读0次

数值的整数次方

考点:数学

题目描述、

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0

代码格式要求

public class Solution {
    public double Power(double base, int exponent) {
        
  }
}

解题一

1.思路

两个要点:

<< : 左移运算符,num << 1,相当于num乘以2;   
>> : 右移运算符,num >> 1,相当于num除以2;    
>>> : 无符号右移,忽略符号位,空位都以0补齐(负数用1补齐)

一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。二进制的末位为0表示偶数,最末位为1表示奇数。使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。
2.代码

public class Solution {
    
    public double Power(double base, int exponent) {
        
        if(exponent < 0 && base == 0) throw new RuntimeException("分母不能为0");
        int exp = Math.abs(exponent);
        
        if(exponent == 0) return 1;
        if(exponent == 1) return base;
        //<<      :     左移运算符,num << 1,相当于num乘以2
        //>>      :     右移运算符,num >> 1,相当于num除以2
        //>>>    :     无符号右移,忽略符号位,空位都以0补齐(负数用1补齐)
        double result = Power(base, exp >>> 1);
        result *= result;
        
        //一个整数a, a & 1 这个表达式可以用来判断a的奇偶性。
        //二进制的末位为0表示偶数,最末位为1表示奇数。
        //使用a%2来判断奇偶性和a & 1是一样的作用,但是a & 1要快好多。
        if((exp & 1) == 1) {
            result *= base;
        }
        return exponent < 0 ? (1.0 / result) : result;
        
    }
    public static void main(String[] args) {
        Solution sl = new Solution();
        System.out.println(sl.Power(5.0, 3));
    }
}

解题二

1.思路

幂的底数和指数的满足情况:
1、底数为零抛出异常但是这里他是底数和指数都为零时才抛出异常。
2、底数不为零,指数为零,返回1
3、底数不为零,指数不为零的情况下,分指数为正负数的时候

·指数为负数的时候先取反不然最高位为1会多乘一次,导致结果不正确,最后面的得数取倒数就可以了。
· 写出指数的二进制表达,例如13表达为二进制1101。
· 举例:10^1101=10。
· 通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
2.代码

public class Solution {
    public double Power(double base, int exponent) {
        double res = 1,curr = base;
        if(exponent == 0){
            if(base==0)
                throw new RuntimeException("分母不能为0"); 
            else return 1;
        }
        int e = exponent > 0 ? exponent: -exponent;
        while (e != 0) {
            res = (e & 1) != 0 ? res * base : res;
            base *= base;//这一步特别重要不要忘了,一定要翻倍的
            e = e >> 1;
        }
        return exponent > 0 ? res : 1/res;
  }
}

相关文章

网友评论

      本文标题:《剑指offer》(十二)-数值的整数次方(java)

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