1、题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
2、思路
需要考虑到的情况:
(1)指数为负数的时候,可以先对指数求绝对值, 算出次方之后的结果再取倒数。
(2)当底数是0,指数是负数的时候,可以将无效变量设置为true,并返回0。
(3)当底数和指数都为0时,因为0的0次方在在数学上是没有意义的,直接返回1。
代码如下:
public class Solution {
boolean g_InvalidInput = false;
/**
指数大于等于1的整数,即指数不为0或负数的情况,求数值的整数次方函数。
*/
double PowerWithExponent(double base,int exponent){
double result = 1.0;//包含了底数不为0,指数为0的情况
for(int i=1;i<=exponent;++i){
result *= base;
}
return result;
}
/**
主函数
*/
public double Power(double base, int exponent) {
if(base==0.0 && exponent<0){//如果底数为0,并且指数小于0,无效的输入
g_InvalidInput = true;
return 0.0;
}
int absExponent = exponent;
if(exponent < 0){
absExponent = -exponent;
}
double result = PowerWithExponent(base,absExponent);
if(exponent < 0){
result = 1.0/result;
}
return result;
}
public static void main(String args[]){
Solution s = new Solution();
double base = 5;
int exponent = 2;
System.out.println(s.Power(base,exponent));
}
}
3、更高效的解法,即对PowerWithExponent函数进行改进,代码如下。
public class Solution {
boolean g_InvalidInput = false;
/**
最高效,又全面的解法
*/
double PowerWithExponent(double base,int exponent){
if(exponent == 0){
return 1;
}
if(exponent == 1){
return base;
}
double result = PowerWithExponent(base,exponent>>1);//递归调用,32次方等于16的平方
result *= result;//将结果平方
if((exponent&0x1) == 1){//指数是奇数,就再乘以一个底数
result *= base;
}
return result;
}
/**
主函数
*/
public double Power(double base, int exponent) {
if(base==0.0 && exponent<0){//如果底数为0,并且指数小于0,无效的输入
g_InvalidInput = true;
return 0.0;
}
int absExponent = exponent;
if(exponent < 0){
absExponent = -exponent;
}
double result = PowerWithExponent(base,absExponent);
if(exponent < 0){
result = 1.0/result;
}
return result;
}
public static void main(String args[]){
Solution s = new Solution();
double base = 5;
int exponent = 2;
System.out.println(s.Power(base,exponent));
}
}
----------------------------------------------------------------------------------------------------------------------------------
完全是自己写的代码:
public class Solution {
public double res1(double base,int exponent){
double result = 1;
for(int i=0;i<exponent;i++){
result = result * base;
}
return result;
}
public double Power(double base, int exponent) {
boolean isValid = true;
if(base==0 && exponent<0){
isValid = false;
return 0;
}
if(base==0 && exponent==0){
return 0;
}
if(exponent == 1){
return base;
}
if(exponent == 0){
return 1;
}
if(exponent > 0){
return res1(base,exponent);
}
if(exponent < 0){
double result = res1(base,-exponent);
result = 1 / result;
return result;
}
return 0;
}
}