菜鸟学快速幂算法

由一道题引出主题:

题目描述:

计算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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值