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

剑指Offer--第16题 数值的整数次方

时间:2018-07-09 14:19:05      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:异常   剑指offer   math   常见   判断   pre   大数   循环   ++   

第16题 数值的整数次方

题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路 看到有点懵,第一感觉觉得是不是应该考虑0的0次或者负数情况,还有就是浮点类型没办法使用"="号,最后自己以偷懒的方式直接调用Java的API,如果面试题中不让调用库函数,那么基本上这题就是挂了可能。
以上题目描述来自牛客,没有对使用做限制。真正的剑指offer上有限制条件不得使用库函数,同时不需要考虑大数问题。

自己的low代码

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

剑指offer思路::需要将所有情况考虑全面:base可为正、0和负,同样exponent也可以为正、0和负。1、当base为0,exponent为负时,这是一种常见的异常,分为为0异常;2、当exponent为0时;3、expoonent为负;4、考虑运行效率问题;
结果正确,但效率不高的写法:

public class Solution {
    public double Power(double base, int exponent) {
        if(base==0&&exponent<0) {
            return 0;
        }
        if(exponent==0) { //这样判断是合理的;
            return 1;
        }
        
        int ex = exponent;
        if(exponent<0){  //容易忽略;
            ex = -exponent;
        }
        double result = 1;
        for(int i=0;i<ex;i++ ) { //效率不高;
            result *= base;
        }
        if(exponent<0) {
            result=1/result;
        }
        return result;
    
      }
}

问题:除了使用for循环外,还有就是double为0等号的使用,之前一直有一个错觉就是浮点类型不能使用等号判断,因为不准确,所以对这种写法第一反应就是不正确。但是看了看了网上的解释发现,其实这种写法有道理的,因为

回复于 2013-11-27 09:55:46 #5 得分:5
首先一个 double 是否为 0,或者其他的数值,是精确的,可以使用== 。
比如 double f = 0; 此时 f 是精确为 0 ,f == 0 为 true。
但是,double 在运算中,由于截尾的原因,总是有误差的。而此时是否为0,要看你的这个运算的精度要求。
比如运算后,f = 0.001,此时不能简单去和 e 去比较。

剑指Offer--第16题 数值的整数次方

标签:异常   剑指offer   math   常见   判断   pre   大数   循环   ++   

原文地址:https://www.cnblogs.com/LynnMin/p/9282700.html

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