题目:
实现函数double power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
分析:
自以为题目简单的解法:
看起来很简单,做一个循环,将base乘以exponent次即可。很明显,这样的考虑不全面。如果exponent是0或者负数呢?
全面但不够高效的解法,我们离Offer已经很近了:
如果exponent是0,那么任何数的0次幂都是1,这里,0的0次幂按照1来考虑。
如果exponent是负数,那么可以先把exponent求绝对值,再求base的exponent次幂,再求一次倒数即可。这里还要注意0的负数次幂,没法求倒数,这里输出Infinity。
既全面又高效的解法,确保我们能拿到Offer:
在前面求矩阵的n次幂时候,我们用到一个快速幂的公式,同样,在这里也可以应用上,前面用的递归的写法,这里我改成循环的写法。
解法:
自以为题目简单的解法:
package com.wsy;
public class Main {
public static void main(String[] args) {
double result = power(3, 5);
System.out.println(result);
}
public static double power(double base, int exponent) {
double result = 1;
for (int i = 0; i < exponent; i++) {
result *= base;
}
return result;
}
}
全面但不够高效的解法,我们离Offer已经很近了:
package com.wsy;
public class Main {
public static void main(String[] args) {
double result = power(3, -1);
System.out.println(result);
}
public static double power(double base, int exponent) {
double result = 1;
boolean flag = false;
if (exponent < 0) {
exponent = -exponent;
flag = true;
}
for (int i = 0; i < exponent; i++) {
result *= base;
}
if (flag) {
result = 1 / result;
}
return result;
}
}
既全面又高效的解法,确保我们能拿到Offer:
package com.wsy;
public class Main {
public static void main(String[] args) {
double result = power(3, -1);
System.out.println(result);
}
public static double power(double base, int exponent) {
double result = 1;
boolean flag = false;
if (exponent < 0) {
exponent = -exponent;
flag = true;
}
while (exponent != 0) {
if ((exponent & 1) == 1) {
result *= base;
}
base *= base;
exponent >>= 1;
}
if (flag) {
result = 1 / result;
}
return result;
}
}