数值的整数次方

来源:互联网 发布:fastcopy的软件 编辑:程序博客网 时间:2024/05/16 14:13

数值的整数次方(Java实现,与自带的幂函数进行了比较,结果完全一样)
自己编写一个求幂的函数,但是不允许调用系统的幂函数。
注:底数类型可以为double,指数类型只能为整数。

分析:不仅需要考虑底数的符号,以及底数和指数分别为正,零,负数的情况,剑指offer中的解答好像是有漏洞的,具体在代码中说明了。
代码如下:

package problem1;import java.util.Scanner;/** * @author Hutongling * */public class 数值的整数次方 {    static double power1(double base, int exp) {        if (base - 0.0000000000000001 == 1 && base + 0.0000000000000001 == 1 || exp == 0)// 当base=1的时候值为1            return 1;        else if (base == 0) // 当base=0的时候值为0            return 0;        else if (base - 0.0000000000000001 == -1 && base + 0.0000000000000001 == -1)// 当base=-1的时候值为(-1)^exp            return exp % 2 == 0 ? 1 : -1;        else {            if (base > 0) {                if (exp > 0)                    return power1(base, exp - 1) * base;                else if (exp < 0)                    return 1 / (power1(base, -(exp + 1)) * base);            } else {                if (exp > 0)                    return power1(base, exp - 1) * base;                else if (exp < 0)                    return 1 / power1(base, -exp);            }        }        return 0;    }    // 这个只能计算指数是无符号数的情况,即exp>=0的时候才能用这个,这种方法是带有缺陷的,    // 上面的方法power1(base,exp)也带有缺陷,但是在main()中已经解决了,在base==0&&    // exp<=0的时候,其结果为“Infinity”    static double power2(double base, int exp) {        if (exp == 0)            return 1;        else if (exp == 1)            return base;        double result = power2(base, exp >> 1);        result *= result;        if ((exp & 1) == 1)            result *= base;        return result;    } public static double Power(double base, int exponent) {       if(base==0)           return 0;         else if(exponent==0)            return 1;        else if(exponent==1)            return base;        else if(base!=0 && exponent>0)            return base*Power(base,exponent-1);        else if(base!=0 && exponent<0)            return 1/(base*Power(base,-exponent-1));        return 0.0;  }    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        while (in.hasNext()) {            double base = in.nextDouble();            int exp = in.nextInt();            if (base == 0 && exp < 0)                System.out.println("Infinity");            else                System.out.println(power1(base, exp));            // System.out.println(power2(base,exp));            if (base == 0 && exp < 0)                System.out.println("Infinity");            else                System.out.println(Power(base, exp));            System.out.println(Math.pow(base, exp));        }    }}
1 0
原创粉丝点击