快速幂问题

快速幂问题

问题:计算以m为底,n为指数的幂

基本思路:

从指数出发,
若指数为偶数,那么m^n = (m * m)^(n/2);
若指数为奇数,那么m^n = (m * m)^((n-1))/2) * m;

*举个栗子:
3^10=(3 * 3) * (3*3) * (3 * 3) * (3 * 3) * (3 * 3);
=(3 * 3)^5 = 9^5
=(9 * 9)^((5-1)/2)9;

在编程时遇到判断一个数是否为奇数(偶数)时:

可以运用一个定理:一个数若为奇数,则其二进制形式最后一位数为1;
一个数若为偶数,则其二进制形式最后一位数为0;
那么我们将该数x&1,其结果为1,x为奇数;其结果为0,x为偶数;

具体实现时可以用移位运算来优化代码:
x除以2 :x>>=1;
x乘以2 :x<<=1;

易理解版

**long long kpow(long long down,long long top)
{
	long long temp=1;
	while(top>0)
	{           //若指数为奇数
		if(top%2==1)
		{
			temp=temp*down%mod;
			top=(top-1)/2;
			down=(down*down)%mod;
		} 
                       //若指数为偶数
		else
		{
			top/=2;
			down=(down*down)%mod;
		}
	}
	return temp;
}**

精简版

**long long kpow(long long down,long long top)
{
	long long result=1;
	while(top>0)
	{
		if(top&1)
			result=result*down%mod;
                       //当top为奇数时,(top-1)/2==top/2 
		top>>=1;
		down=(down*down)%mod;
	}
	return result;
}**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值