快速幂&快速幂取模算法

在平时我们需要求一个a^b时,一般会用c++自带的pow()函数对吧,可是加入数据十分大时,pow()是十分慢的,这个时候我们需要一个能高效求出a^b的算法,这这时就出现了快速幂算法。

假如我们需要求3^999,那么我们是不是可以发现3^999 =3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)=(3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3。我们可以先把999拆开,拆成 (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1),这时会发现他们是2的n次方。就可以使用分治的思想把(3 ^ 512) 、(3 ^ 256) 、 (3 ^ 128) 、 (3 ^ 64) 、(3 ^ 32) 、(3 ^ 4) 、 (3 ^ 2) 、3^1分别求出后再相乘,就有了递归算法。

int recursion(int a,int b){
    int tem = 1;
    if(b == 0)return 1;
    else if(b == 1)return a;
    tem = tem*recursion(a,b>>1);
    tem = tem*tem;
    if(b&1)tem = tem*a;
    return tem;
}

将快速幂递归算法改进后就有了递推算法

int loop(int a,int b){
	int tem = 1,ret = a;
	while(b > 0){
		if(b&1)tem = tem*ret;
		ret = ret*ret;
		b >>= 1;
	}
	return tem;
}

这就是快速幂算法,当然很多时候我们还会遇到一个(a^b)%c其中a^b非常大,就有了快速幂取模算法。

int quickpow(int a,int b,int k){
	int tem = 1,ret = a;
	while(b > 0){
		if(b&1)tem = (tem*ret)%k;
		ret = (ret*ret)%k;
		b >>= 1;
	}
	return tem;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值