快速幂计算

剑指offer里有一个计算整数幂的题目,并不是看一眼就懂的题目。

题目用pow()也可以过,但是考点当然不是用库函数


给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。


1.先说一个不用递归的经典求快速幂的方法

举个例子,a^11

把11转化为2进制,是1011 = 2^0 + 2^1 + 2^3 .  那么a^11 = a^(2^0) * a^(2^1) * a^(2^3),就成为了一个按位去累乘的过程

class Solution {
public:
    double Power(double base, int exponent) {
        double r=1;int n;        // r 存结果,n为exponent的绝对值
        if(exponent==0)		 // 考虑指数为正、负、零的情况
            return 1;
        else if(exponent < 0)
            n = -exponent;
        else
            n = exponent;
        while(n != 0){          // 将 n 从最低位开始检测,不断右移,如果最低位是 1 ,那么 r 就乘base(base已经不一定是原来的base)
            if(n & 1 == 1){
                r *= base;
            }
            n = n >> 1;        
            base *= base;       //每次右移后都把 base 平方
        }
        return exponent>0 ? r:1/r;
    }
};

2.再说一下递归算法

当幂数为偶数:a^n = a^(n/2) * a^(n/2)

当幂数为奇数:a^n = a^((n-1)/2) * a^((n-1)/2) * a

因此我们很容易得出了递归的方法,下面贴出代码

class Solution {
public:
    double Power(double base, int exponent) {
        double ret=1;int n = abs(exponent);
        if(exponent==0)
            return 1;
        if(n == 1)
            return base;
        if(n == 2)
            return base*base;
        if(n%2==0){
            ret = Power(base, n/2) * Power(base, n/2);      //偶数
        }
        else
            ret = Power(base, (n-1)/2) * Power(base, (n-1)/2) * base; //奇数
        return exponent>0 ? ret:1/ret;
    }
};



### 回答1: 下面是快速幂计算阶乘的代码: ``` def fast_factorial(n): if n == 0: return 1 elif n == 1: return 1 elif n % 2 == 0: return fast_factorial(n // 2) ** 2 else: return n * fast_factorial(n - 1) ``` 使用方法:调用 `fast_factorial(n)` 即可得到 `n!` 的值。 注意:由于快速幂算法的时间复杂度为 O(log n),所以计算阶乘的速度要比传统算法快得多。但是,由于算法的复杂度取决于对数的底数,所以在实际应用中,这种优化可能并不明显。 ### 回答2: 下面是一个使用快速幂计算阶乘的代码示例。 ```python def factorial(n): if n < 0: return None if n == 0 or n == 1: return 1 result = 1 base = 2 while n > 1: if n % 2 == 1: result *= base base = base * base n = n // 2 return result * base ``` 在这个代码中,我们使用了快速幂的思想来计算阶乘。首先,我们设置一个变量result来保存最终的计算结果,初始值为1。我们还设置一个变量base来保存base ^ n,初始值为2,n为要计算阶乘的数。然后,我们进入一个while循环,当n大于1时,进行循环计算。 在循环中,我们首先判断n是否为奇数,如果是奇数,我们就将result乘以base。然后,我们将base乘以base,相当于将base的指数加倍。接着,我们将n除以2,相当于将指数减半。 循环结束后,我们最终的计算结果为result * base,即阶乘的值。 需要注意的是,这个代码对输入的n做了一些条件判断。当n小于0时,返回None,表示输入无效。当n等于0或者1时,直接返回1,因为0的阶乘和1的阶乘都等于1。 希望这个代码能帮助到你,如果有任何问题,请随时提问。 ### 回答3: 快速幂算法是一种用于快速计算幂的方法。在计算阶乘时,可以利用快速幂算法来减少计算次数。 以下是快速幂计算阶乘的代码: ``` def fast_power(base, exponent, mod): result = 1 while exponent > 0: if exponent % 2 == 1: result = (result * base) % mod base = (base * base) % mod exponent = exponent // 2 return result def factorial(n, mod): result = 1 for i in range(1, n+1): result = (result * fast_power(i, n, mod)) % mod return result # 例子:计算10的阶乘模1000000007 mod = 1000000007 n = 10 result = factorial(n, mod) print(result) ``` 在这个代码中,`fast_power`函数使用快速幂算法计算幂的结果。`factorial`函数则通过循环调用`fast_power`来计算阶乘的结果,并且使用取模运算来防止数值溢出。最后,可以根据需要设定模数`mod`和阶乘的数值`n`来得到结果。 以上就是快速幂计算阶乘的代码。希望对您有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值