劍指Offer 011 數值的整數次方

2021-07-11 03:17:46 字數 2091 閱讀 4347

牛客oj:數值的整數次方

九度oj:

github**: 011-數值的整數次方

csdn題解:劍指offer–011-數值的整數次方

牛客oj

九度oj

csdn題解

github**

數值的整數次方

1514-數值的整數次方

劍指offer–011-數值的整數次方

011-數值的整數次方

您也可以選擇回到目錄-劍指offer–題集目錄索引

題目描述

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

class solution

return res;

}};

貌似我們已經完美的解決了問題,但是真的這樣麼?

我們輸入乙個指數為負數的情況

solution solu;

cout

<2, -3) 《可見我們的演算法是多麼的自以為是啊?

前面所說的指數為負數只是邊界的一種情況,學習演算法,必須全面了解所有的邊界

指數冪的所有邊界包括

#include

#include

using

namespace

std;

// 除錯開關

#define __tmain main

#ifdef __tmain

#define debug cout

#else

#define debug 0 && cout

#endif // __tmain

class solution

// 指數為負數的情況下,底數不能為0

if(equal(base, 0.0) == true && exponent < 0)

double res = 1.0;

if(exponent > 0.0)

else

return res;

}private :

double powernormal(double base, int exponent)

return res;

}double equal(double left, double right)

else

}};int __tmain( )

那麼還有沒有更加快速的辦法呢?

別急,我們慢慢來分析

寫出指數的二進位制表達,例如13表達為二進位制1101。

舉例:10^1101 = 10^0001*10^0100*10^1000。

通過&1和》1來逐位讀取1101,為1時將該位代表的乘數累乘到最終結果。

簡單明瞭,看來結果根指數中1的個數和位置有關係,那麼就簡單了,還記得劍指offer–010-二進位制中1的個數

double powernormal(double base, int exponent)

else

if(exponent == 1)

int res = 1, temp = base;

while(exponent != 0)

// 移位後, curr需要翻倍, 這樣到下個

temp *= temp; // 翻倍

exponent >>= 1; // 右移一位

}return res;

}

當然也可以用遞迴的寫法

double powernormal(double base, int exponent)

else

if(exponent == 1)

double res = powernormal(base, exponent >> 1);

res *= res;

if((exponent & 1) == 1)

return res;

}

「`

劍指offer 數值的整數次方

1 題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。2 思路 需要考慮到的情況 1 指數為負數的時候,可以先對指數求絕對值,算出次方之後的結果再取倒數。2 當底數是0,指數是負數的時候,可以將無效變數設定為true,並返回0。3...

劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。將指數大於0,小於0,等於0 底數不為0 的情況分開。其實指數為0的情況不必單獨拎出來 不進入if直接返回result為1.0 真正需要考慮的是,底數為0而指數為負的情況,數學上沒有意義。書...

劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。1.最直觀的方法,遞迴求解a b a a b 1 當然也可以用迴圈實現。要注意特殊情況,指數為0時乘方結果都是1 指數為負數時的計算,可以先轉化為正數再求倒數,但是底數為0時不能求導。2.效...