快速幂的算法
快速幂算法一般用于指数比较大的幂运算,例如3的100次方,2的50次方等等,相比于使用pow(a,b)函数来说,快速幂运行所需时间更小,在一些有时间限制的题目上有着非常大的优势
算法原理:
例如我要算3的100次方,我们可以不停的3x3x3x3……x3一直乘到第100-1个3,这样算起来虽然比较直观易懂,但是如果放到代码上去运行步骤会非常的重复繁琐,而且运行的时间比较长
快速幂原理是将3的100拆分为3的50次方和3的50次方相乘,而3的50次方又可以拆分为3的25次方与3的25次方相乘
只要指数为偶数的都可以对半拆分
如果遇到指数为奇数的情况(如上图的3的25次方),我们可以先拿出一个数来,让指数变为偶数,然后再让剩下的指数对半拆分例如上图的3的25次方,我们可以把它拆为
剩下的过程以此类推:
一般来说指数不是偶数就是奇数
如果是奇数就把它转化为偶数
如果是偶数就把它对半拆分
整个算法的原理可以举一个通俗的例子来解释
如果我们要复制一个句子:My name is Mr VK
我们要把它复制100句,如果我们一个一个去复制粘贴的话我们需要复制100次,这很不方便,其实我们可以先复制10句,再将这10句话复制10次就可以达到100句,快速幂的原理就是这个道理
代码实现:
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
long long int r=1;//因为幂运算的结果可能是一个很大的数值所以用long long整型来储存
while(b!=0)
{
if(b%2==0)//b如果是偶数的情况
{
b=b/2;
a=a*a;
}
else//b如果是奇数的情况
{
b=b-1;
r=r*a;
}
}
printf("%lld\n",r);
return 0;
}