菜鸟学快速幂算法

来源:互联网 发布:绝知的意思 编辑:程序博客网 时间:2024/04/29 12:57

由一道题引出主题:

题目描述:

计算A的B次幂对C取模(A^BmodC)并且1<=A,B,C<=32768.

输入三个整数A,B,C,输入文件每一行依次三个整数a,b,c用空格隔开

每行输出一个运算结果

代码:

#include<iostream>
using namespace std;


int pow(int a,int b,int c)
{
if(b==0)
return 1;
else
if(b==1)
return a%c;
else
if(b%2)
return (a*pow(a,b/2,c)*pow(a,b/2,c))%c;
else
return (pow(a,b/2,c)*pow(a,b/2,c))%c;
}
main()
{
int a,b,c;
while(cin>>a>>b>>c)
{
cout<<pow(a,b,c)<<endl;
}
}

算法思想:

二分的思想,比如a的8次方等于a的四次方的平方,等于a的二次方的平方的平方。而a的7次方等于a*a的三次方的平方,等于a*(a*a的一次方的平方)的平方。所以要对b的奇偶性讨论,抛开这题来说,快速幂的算法代码如下:

#include<iostream>

using namespace std;

int pow(int a,int b)

{

if(b==0)

return 1;

else

if(b==1)

return a;

else

if(b%2)

return a*pow(a,b/2)*pow(a,b/2);

else

return pow(a,b/2)*pow(a,b/2);

}

使用快速幂可以大大减小时间复杂度,其时间复杂度为O(log2n)。而朴素算法为O(n)。

原创粉丝点击