快速幂
快速幂 ( Exponentiation by squaring ,平方求幂)是一种简单而有效的小算法,它可以以 的时间复杂度计算乘方。. 快速幂不仅本身非常常见。
让我们先来思考一个问题:7的10次方,怎样算比较快?
方法1:最朴素的想法,7*7=49,49*7=343,... 一步一步算,共进行了9次乘法。
这样算无疑太慢了,尤其对计算机的CPU而言,每次运算只乘上一个个位数,无疑太屈才了。这时我们想到,也许可以拆分问题。
方法2:先算7的5次方,即7*7*7*7*7,再算它的平方,共进行了5次乘法。
但这并不是最优解,因为对于“7的5次方”,我们仍然可以拆分问题。
方法3:先算7*7得49,则7的5次方为49*49*7,再算它的平方,共进行了4次乘法。
模仿这样的过程,我们得到一个在 logn 时间内计算出幂的算法,也就是快速幂。
非递归快速幂:(a位基数,b位指数)
int power(int a, int b)//求a的b次幂
{
int ans = 1;
while (b)
{
if (b % 2)
ans = ans * a;
a = a * a;
b = b / 2;
}
return ans;
}
注意快速幂一般与取模共同使用,因为当幂数过大时可能会超出范围所以一般去摸。
最大公因数(辗转相除)
int gcd(int minn, int maxn)
{
while (minn != 0)
{
int temp = maxn% minn;
maxn = minn;
minn = temp;;
}
return maxn;
}
LCM(a,b)=(a*b)/GCD(a,b);LCM为最小公倍数,GCD为最大公因数。求解两数的最小公倍数时一般先去求解其最大公因数。
直接求解LCM时a*b可能会超出范围所以可以:(a/GCD)*b先除在乘。
递归精简版:
int gcd_1(int a, int b){
return b == 0 ? a:gcd_1(b, a%b);
}