这两个算法主要是位运算的一个应用。
快速乘
说算法前,让我们先来算一个式子吧:
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; }