版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/littlehaes/article/details/91411186
welcome to my blog
剑指offer面试题16(java版):数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
- 按base和exponent取值分情况讨论, 具体见注释
- 当exponent为负数时,要注意将base取倒数,同时将exponent变成正数,表示base自乘exponent次
复杂度
public class Solution {
public double Power(double base, int exponent) {
/*
底数分成两种:(1)非零, (2)0
指数分成三种:(1)正数, (2)负数, (3)0
具体地,
1.底数非零时,分为两种情况
1.1指数大于等于0:直接求次方
1.2指数小于0:base要取倒数; 还要注意把exponent变为正数,表示base自乘exponent次
2.底数是零时,指数需要分情况讨论
2.1指数是正数:返回0
2.2指数是0:返回0(这个自己定义)
2.3指数是负数:不允许,因为0无法作为分母
*/
double result=1;
//1.
if(base != 0 ){
//1.2
if(exponent<0){
exponent = -1*exponent;
base = 1/base;
}
//1.1
for(int i=0; i<exponent; i++)
result *= base;
return result;
}
//2.1, 2.2
if(exponent>= 0)
return 0;
//2.3
return 0;
}
}
更高效的代码
思路
- 不再采用逐个相乘的方式,也就是指数每次增加1
- 令指数也成指数变化,比如指数依次为:1,2,4,8,…
- base^exponent的结果可以根据exponent的奇偶分成两种情况
- 情况一: exponent为偶数, 那么base^exponent = base^(exponent/2)*base^(exponent/2)
- 情况二: exponent为奇数, 那么base^exponent = base^((exponent-1)/2)*base^((exponent-1)/2)*base
- 代码中(exponent-1)/2直接写成exponent/2即可
- 指数不断除以2,最终会变成…8,4,2,1,0 注意找好递归终止条件
- 最后要额外注意, 在递归函数中,base是double类型, 因为指数为负数时,底数要取倒数,所以得用double类型, 这是个细节
public class Solution {
public double Power(double base, int exponent) {
/*
底数分成两种:(1)非零, (2)0
指数分成三种:(1)正数, (2)负数, (3)0
具体地,
1.底数非零时,分为两种情况
1.1指数大于等于0:直接求次方
1.2指数小于0:base要取倒数; 还要注意把exponent变为正数,作为乘几次的标志
2.底数是零时,指数需要分情况讨论
2.1指数是正数:返回0
2.2指数是0:返回0(这个自己定义)
2.3指数是负数:不允许,因为0无法作为分母
*/
double result=1;
//1.
if(base != 0 ){
//1.2
if(exponent<0){
exponent = -1*exponent;
base = 1/base;
}
//1.1
return PowerCore(base, exponent);
}
//2.1, 2.2
if(exponent>= 0)
return 0;
//2.3
return 0;
}
private double PowerCore(double base, int exponent){ // 递归函数中, base是double类型, 为了处理负指数,需要把之前的base取到数
if(exponent==0)
return 1;
double result = 1;
double yinShu = PowerCore(base, exponent/2);
if((exponent&1)==1)//如果指数是奇数,结果要多乘一个base
result *= base;
result = yinShu*yinShu*result;
return result;
}
}