快速幂与快速乘

这两个算法主要是位运算的一个应用。
快速乘
说算法前,让我们先来算一个式子吧:
3 * 5 = 3 * (1 + 4) = 3 * 1 + 3 * 4 = 3 * 2^0 + 3 * 2^2 = 3 + 12 = 15
注意一下3 * 2^0 + 3 * 2^2,没错,二进制!!!!!!!!
因为在计算机中实际使用的也是二进制,所以我们可以轻松去模拟出3 * 2^0 + 3 * 2^2,下面见代码:

int fast_multi(int num1, int num2)
{
    int ans = 0;  //定义开始的值
    int base = num1;  //定义基数如 3 * 5 中, 可以把3作为基数,也可以把5作为基数
    while(num2)
    {
        if(num2 & 1)  //当遇到被乘数的二进制中的1时,答案值加上基数
            ans += base;
        base += base;  //基数乘2
        num2 >>= 1;  //被乘数左移一位,相当于除以2
    }
    return ans;
}


快速幂
还是像上面一样,举个例子先,如:
3 ^ 3 = 3 ^ (1 + 2) = 3 ^ 1 * 3 ^ 2 = 3 * 9 = 27
没想错,还是二进制!!!!!!!!
我们要做的就是模拟 3 ^ 1 * 3 ^ 2 这个过程,见代码:

int fast_pow(int num, int k)
{
    int ans = 1;  // 初始化答案
    int base = num;  // 定义基数,如3^5 的基数是3
    while(k)
    {
        if(k & 1)  // 当遇到幂的二进制中的1时,更新答案,即答案乘基数
            ans *= base;   
        base *= base;  //基数平方
        k >>= 1;   //幂左移一位,想当于除以2
    }
    return ans;
}

猜你喜欢

转载自www.cnblogs.com/li1234567980/p/10878072.html