1. 程式人生 > 其它 >劍指offer:數值的整數次方

劍指offer:數值的整數次方

技術標籤:演算法

文章目錄

題目描述

給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
保證base和exponent不同時為0

思路及程式碼

方法一:暴力方法

很顯然就是n個b相乘。迴圈n次。

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent == 0)
            return 1;
        
        if
(exponent<0){ base = 1/base; exponent = -exponent; } double res = base; while(exponent>1){ exponent--; base = base * res; } return base; } };

方法二:遞迴法(快速冪)

> 這裡是引用

class Solution {
public:
    double
recursion(double b,int n){ if(n==0) return 1.0; double ret = recursion(b,n/2); // n&1判斷為1就是奇數,因為奇數的二進位制最後一位永遠都是1 if(n&1){ return ret*ret*b; } else{ return ret*ret; } } double Power(double base, int
exponent) { if(exponent<0){ base = 1 / base; exponent = -exponent; } return recursion(base,exponent); } };

方法三:非遞迴的快速冪

在這裡插入圖片描述

class Solution {
public:

    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        double x = b; // 記錄x^0, x^1, x^2 ...
        double ret = 1.0;
        while (n) {
            if (n&1) {
                ret *= x; // 二進位制位數是1的,乘進答案。
            }
            x *= x;
//             算術右移一位;比如3(11)右移一位變成1(1)
            n >>= 1;
        }
        return ret;
    }
};