[名企面试知识点][Java]浮点数的整数次方
发布于 2017-03-07 13:13 2523 次浏览 0 赞 来自 笔试面试  

题目描述

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

输入描述

base,exponent

输出描述

base的exponent次方

题目分析

首先要注意,指数正负和零的情况判别:

①任何数的0次方等于0

②0不能做除数(也就是指数为负时,基数不能为0)

解法一  运行时间:27ms 占用内存:636k 

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

       int flag = exponent;//接下来exponent会改变

       if(exponent==0){
           return 1;
       }
       if(exponent<0){
           exponent = -exponent;

           if(base==0){
           throw new RuntimeException("分母不能为0");
         }
       }
       double result = 1;        
       for(int i=0;i<exponent;i++){
           result*=base;
       }

        return flag < 0 ? 1 / result : result;
 }
}

解法二  运行时间:30ms 占用内存:510k

 把指数以二进制的形式表达:   举例(10^13)有10^1101 = 10^000110^010010^1000。 通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。

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

       int flag = exponent;//接下来exponent会改变
       if(exponent==0){
           return 1;
       }
       if(exponent<0){
           exponent = -exponent;

           if(base==0){
           throw new RuntimeException("分母不能为0");
          }
       }

       double result = 1;        
       while(exponent!=0){
           if((exponent&1)==1){
               result*=base;
           }
           exponent>>=1;
           base *=base;  //指数右移一位,底数翻倍
       }

        return flag < 0 ? 1 / result : result;
 }
}

解法三  运行时间:33ms  占用内存:629k

  调用库函数

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

因为pow最终会调用一个native方法,所以时间上还是可以的。


添加回复
回到顶部