(三)快速幂的证明和代码

今天的内容是 F a s t P o w e r Fast Power FastPower快速幂,是编程中求幂的得力能手,一定要背下来哦。
注意:本篇对三目运算符做了一定的介绍。如果已对三目运算符有了解,可跳过“示例代码-铺垫”

做法

在求 x p x^p xp时,若 p p p为偶数,运算 ( x p / 2 ) 2 (x^{p/2})^2 (xp/2)2,否则运算 ( x p / 2 ) 2 ∗ x (x^{p/2})^2*x (xp/2)2x。注意运算 p / 2 p/2 p/2是不四舍五入的整除。

证明

这个证明没有什么难的.
假设 p p p是奇数, p p p整除 2 = k 2=k 2=k,那么 p = k + k + 1 p=k+k+1 p=k+k+1是显而易见的。
(三)快速幂的证明和代码_第1张图片
例如: ( 3 3 / 2 ) 2 ∗ 3 = ( 3 1 ) 2 ∗ 3 = 3 2 ∗ 3 = 3 3 (3^{3/2})^2*3=(3^1)^2*3=3^2*3=3^3 (33/2)23=(31)23=323=33
偶数情况只是少了 ∗ x *x x这个多余的 1 1 1而已,可自行证明一下。

区别

时间复杂度从 O ( n ) O(n) O(n)变为 O ( l o g O(log O(log n ) n) n)。假设我们已经有了 a a a n n n,且我们要求 a n a^n an
普通幂是这样实现的:

int ans=a;
int pow(int a,int n){
	for(int i=1;i<n;i++){
		ans*=a;
	}
}

此方法运行了 n n n次。
快速幂的写法是递归:

int pow(int a,int n){
	if(p==0)return;
	int t=pow(a,n/2);
	if(n%2==0){
		return t*t;
	}
	else{
		return t*t*a;
	}
}

示例代码-铺垫

实际上上面的代码就是正确的代码,但希望通过这篇博客,大家能认识一个新东西:三目运算符。
C + + C++ C++ 中惟一的三目运算符是这样写的:

(expression) ? (do something) : (do something else)

它相当于:

if(expression)
	do something;
else
	do something else;

那么为什么使用此运算符呢?因为它短小精悍。当然,如果 i f if if后面有多句话,就不提倡这么做了。

  • 经典的用三目运算符的例子:
int compare_which_bigger(int a,int b){
	a>b ? return a : return b;
}
  • 经典的反面例子:
int compare_which_biggest(int a,int b,int c,int d,int e){
	a>b||a>c||a>d||a>e ? return a : (b>c||b>d||b>e||b>a ? return b : (c>a||c>b||c>d||c>e ?return c : (d>a||d>b||d>c||d>e ? return d : return e)));
}

示例代码

int pow(int a,int n){
	if(p==0)return;
	int t=pow(a,n/2);
	n%2==0 ? return t*t : return t*t*a;
}

你可能感兴趣的:(算法)