标签:异常 剑指offer math 常见 判断 pre 大数 循环 ++
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路 看到有点懵,第一感觉觉得是不是应该考虑0的0次或者负数情况,还有就是浮点类型没办法使用"="号,最后自己以偷懒的方式直接调用Java的API,如果面试题中不让调用库函数,那么基本上这题就是挂了可能。
以上题目描述来自牛客,没有对使用做限制。真正的剑指offer上有限制条件不得使用库函数,同时不需要考虑大数问题。
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 math 常见 判断 pre 大数 循环 ++
原文地址:https://www.cnblogs.com/LynnMin/p/9282700.html