题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路;
这个题目很简单,主要是要考虑各种情况,将各种情况考虑清楚。
情况1: 0次方,所以的数的0次方均为1;
情况2:整数次方,此时不管数值为么数,直接重复乘以自身即可;
情况3:负数次方,此时如果数值为0,则抛出异常,因为分子不能为0;
代码:
package JianZhiOffer;
public class Power
{
public static void main(String[] args)
{
double a=0.0;
int b=-4;
double c=Power(a,b);
System.out.println(c);
}
public static double Power(double base, int exponent)
{
double result=1.0;
if(exponent==0)
return 1;
else if(exponent>0)
{
for(int i=1;i<=exponent;i++)
{
result*=base;
}
}
else
{
if(base==0)
throw new RuntimeException("分子不能为0");
for(int i=1;i<=-exponent;i++)
{
result*=base;
}
}
return exponent>0?result:(1/result);
}
}
方法2:
思路;
这个题目很简单,主要是要考虑各种情况,将各种情况考虑清楚。
情况1: 0次方,所以的数的0次方均为1;
情况2:整数次方,此时不管数值为么数,直接重复乘以自身即可;
情况3:负数次方,此时如果数值为0,则抛出异常,因为分子不能为0;
代码:
package JianZhiOffer;
public class Power
{
public static void main(String[] args)
{
double a=0.0;
int b=-4;
double c=Power(a,b);
System.out.println(c);
}
public static double Power(double base, int exponent)
{
double result=1.0;
if(exponent==0)
return 1;
else if(exponent>0)
{
for(int i=1;i<=exponent;i++)
{
result*=base;
}
}
else
{
if(base==0)
throw new RuntimeException("分子不能为0");
for(int i=1;i<=-exponent;i++)
{
result*=base;
}
}
return exponent>0?result:(1/result);
}
}
方法2:
写出指数的二进制表达,例如13表达为二进制1101。
通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
举例:10^1101 = 10^0001*10^0100*10^1000
- public double Power(double base, int exponent) {
- double res = 1,curr = base;
- int n;
- if(exponent>0){
- n = exponent;
- }else if(exponent<0){
- if(base==0)
- throw new RuntimeException("分母不能为0");
- n = -exponent;
- }else{// exponent==0
- return 1;// 0的0次方
- }
- while(n!=0){
- if((n&1)==1)
- res*=curr;
- curr*=curr;// 翻倍
- n>>=1;// 右移一位
- }
- return exponent>=0?res:(1/res);
- }