题目如下:
实现函数double Power(double base , int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
这个题目需要注意的有两点:一是我们需要分情况讨论,看似一个数的整数次方很好求,直接用exponent个base撑起来即可,但实际上我们要分以下几种情况。(以下用exp代替exponent)
为负数 base的正数次方分之一
base为负数 exp 为0 1
为正数 直接计算
为负数 不存在
base为0 exp 为0 1
为正数 直接计算
为负数 base的正数次方分之一
base为正数 exp 为0 1
为正数 直接计算
第二个要注意的点是,double判等不能用==符号,只能用两者的差值来判断。(double 在运算中,由于截尾的原因,总是有误差的。)可以用如下代码判断:
public static boolean doubleEqual(double d1 , double d2){
if (d1 - d2 <= 0.0000001) {
return true;
}
return false;
}
另外,这里当判断完成后直接计算有两种思路:
1.用while循环直接计算:
private static double power1(double base, int i) {
// TODO Auto-generated method stub
double result = 1;
while(i != 0){
result = result * base;
i--;
}
return result;
}
2.运用如下公式递归处理:
a^(n/2)*a^(n/2)
a^n =
a^((n-1)/2)*a^((n-1)/2
代码如下:
private static double power1(double base, int i) {
// TODO Auto-generated method stub
double result = 1;
while(i != 0){
result = result * base;
i--;
}
return result;
}
整体代码如下:
package com.offer;
public class Power {
/*
* 计算一个数的整数次方
*/
public static void main(String[] args) {
double base = 5;
int exp = 6;
System.out.println(power(base,exp));
}
private static double power2(double base, int exp) {
// TODO Auto-generated method stub
if (exp == 0 ) {
return 1;
}
if (exp == 1) {
return base;
}
double result = power2(base , exp >> 1);
result *= result;
if ((exp & 1) == 1) {
//若exp为奇数,相当于exp%2==1
result *= base;
}
return result;
}
public static boolean doubleEqual(double d1 , double d2){
if (d1 - d2 <= 0.0000001) {
return true;
}
return false;
}
private static double power(double base, int exp) {
// TODO Auto-generated method stub
if (doubleEqual(base,0.0)) { //若底数等于0
if (exp <= 0) {
throw new RuntimeException("输入数字错误!");
}
return 0 ;
}
if (exp == 0) { //若指数等于0
return 1;
}else if (exp < 0) { //若指数小于0
return 1 / power1(base , - exp);
//return 1 / power2(base , - exp);
}else{ //若指数大于0
// return power1(base , exp);
return power2(base , exp);
}
}
private static double power1(double base, int i) {
// TODO Auto-generated method stub
double result = 1;
while(i != 0){
result = result * base;
i--;
}
return result;
}
}