數值的整數次方

題目

給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。

分析

此題首先需要考慮各種底數和指數的各種情況:
底數爲0時,指數>0,值爲0
底數爲0時,指數=0,值爲1
底數爲0時,指數<0,報錯
底數不爲0時,指數>0,直接算乘方
底數不爲0時,指數=0,值爲1
底數不爲0時,指數<0,1除以乘方

代碼

double Power(double base, int exponent) {
    if (base == 0) {
        if (exponent < 0) {
            throw "invalid input";
        } else if (exponent > 0) {
            return 0;
        } else {
            return 1;
        }
    } else {
        double result = 1;
        int e = abs(exponent);

        while (e != 0) {
            if (e & 1) {
                result *= base;
            }
            base *= base;
            e >>= 1;
        }
        if (exponent < 0) {
            result = 1 / result;
        }
        return result;
    }
}

上述使用的是快速冪算法,除此之外還可以遞歸來求冪。
遞歸思路:
判斷指數n是否爲偶數
n爲偶數,則an=an/2an/2a^n = a^{n/2} * a^{n/2};
n爲奇數,則an=a(n1)/2a(n1)/2aa^n = a^{(n-1)/2} * a^{(n-1)/2} * a;
代碼如下:

double Power(double base, int exponent) {
    if (base == 0) {
        if (exponent < 0) {
            throw "invalid input";
        } else if (exponent > 0) {
            return 0;
        } else {
            return 1;
        }
    } else {
        if (exponent == 1) {
            return base;
        } else if (exponent == 0) {
            return 1;
        } else {
            int e = abs(exponent);
            double result = Power(base, e>>1);
            result *= result;
            if ((e & 1) == 1) {
                result *= base;
            }
            if (exponent < 0) {
                result = 1/result;
            }
            return result;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章