劍指offer面試題11 數值的整數次方

頭像是我偶像發表於2017-06-29

一、題目

實現函式double Power(double base,int exponent ),求base的exponent次方。要求:不得使用庫函式,同時不需要考慮大數問題。

二、思考分析

題目不需要考慮大數問題,看似很簡單,但是需要考慮全面,並且提高效率,才是面試官想要看到的結果。

需要考慮的情況 :
* 指數(exponent)等於零時;
* 指數(exponent)為正數時;
* 指數(exponent)為負數時;
* 底數(base)為零,指數也為零時;

package com.offer.jianzhi;

public class DoublePower {
    // 方法一:考慮全面
    public double power(double base, int exponent) {
        double result = 0.0;
        if (exponent == 0) {
            return 1.0;
        }
        if (base == 0.0) {
            return result;
        }
        if (exponent < 0) {
            result = 1.0 / cal(base, -exponent);
        } else {
            result = cal(base, exponent);
        }
        return result;
    }

    public double cal(double base, int exponent) {
        double d = 1.0;
        for (int i = 0; i < exponent; i++) {
            d = d * base;
        }
        return d;
    }

    // 方法二:提高效率
    public double power2(double base, int exponent) {
        double result = 0.0;
        if (exponent == 0) {
            return 1.0;
        }
        if (base == 0.0) {
            return result;
        }
        if (exponent < 0) {
            result = 1.0 / powerWithUnsignedExponent(base, -exponent);
        } else {
            result = powerWithUnsignedExponent(base, exponent);
        }
        return result;
    }

    public double powerWithUnsignedExponent(double base, int exponent) {
        if (exponent == 0) {
            return 1.0;
        }
        if (exponent == 1) {
            return base;
        }
        double d = powerWithUnsignedExponent(base, exponent >> 1);// exponent>>1表示除以2
        d *= d;
        if ((exponent & 0x1) == 1) {// 判斷exponent是否為奇數
            d *= base;
        }
        return d;
    }

    public static void main(String[] args) {
        double a = Math.pow(3, 32);// 使用庫函式
        System.out.println(a);
        DoublePower dp = new DoublePower();// 方法一
        double d = dp.power(3, 32);
        System.out.println(d);

        double d1 = dp.power2(3, 32);// 方法二
        System.out.println(d1);
    }
}

相關文章