快速幂算法 Quickmod(C语言)

快速幂的算法

快速幂算法一般用于指数比较大的幂运算,例如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次方相乘
快速幂算法 Quickmod(C语言)_第1张图片
只要指数为偶数的都可以对半拆分

如果遇到指数为奇数的情况(如上图的3的25次方),我们可以先拿出一个数来,让指数变为偶数,然后再让剩下的指数对半拆分例如上图的3的25次方,我们可以把它拆为
快速幂算法 Quickmod(C语言)_第2张图片
剩下的过程以此类推:
快速幂算法 Quickmod(C语言)_第3张图片
一般来说指数不是偶数就是奇数

如果是奇数就把它转化为偶数
如果是偶数就把它对半拆分

整个算法的原理可以举一个通俗的例子来解释

如果我们要复制一个句子:My name is Mr VK

我们要把它复制100句,如果我们一个一个去复制粘贴的话我们需要复制100次,这很不方便,其实我们可以先复制10句,再将这10句话复制10次就可以达到100句,快速幂的原理就是这个道理

代码实现:

#include
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;
}

你可能感兴趣的:(C语言,算法,算法,acm竞赛)