由一道题引出主题:
题目描述:
计算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)。