位运算:a^b

    

    手写快速幂函数。

    由于这里需要对p取模,而且p在int范围内,所以不需要高精度。所以就用位运算吧。这里仍然要用到二进制的思想,将b转为2进制来做。eg. ∵11 = 1011(2) = 1 * 2^3 + 0 * 2 ^2 + 1 * 2^1 + 1 * 2^0,∴2^11 = 2^(1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0) = 2^(2^3) * 2^(2^1) * 2^(2^0)。

    代码如下:

#include <stdio.h>

int power(int a, int b, const int &p){
	int ans = 1 % p;/*若b == 0 && p == 1,则 ans = a^b % p = 1 % p = 0。但实际的a^b = 1,所以            
                           这里特殊判断一下*/
	for(; b; b >>= 1){
		if(b & 1) ans = (long long) ans * a % p;
		a = (long long)a * a % p;
	}
	return ans;
}

int main(){
	int a, b, p;
	scanf("%d%d%d", &a, &b, &p);
	printf("%d\n", power(a, b, p));
	return 0;
}

潇洒地结束~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值