Skip to content

Latest commit

 

History

History
100 lines (74 loc) · 1.98 KB

浮点数的整数次方.md

File metadata and controls

100 lines (74 loc) · 1.98 KB

题目描述

给定一个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方法,所以时间上还是可以的。