码迷,mamicode.com
首页 > 其他好文 > 详细

[剑指offer] 浮点数的整数次方

时间:2016-04-29 15:01:28      阅读:120      评论:0      收藏: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^0001*10^0100*10^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方法,所以时间上还是可以的。

[剑指offer] 浮点数的整数次方

标签:

原文地址:http://blog.csdn.net/amazing7/article/details/51279412

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!