快速幂

一般来说,我们计算一个数x的n次幂的时候,认为很是简单。直接乘以x,n次即可。

但是,当我们的n比较大的时候,这将是一个非常花费时间的事情。一下,将描述两种快速幂的方法。

普通计算法:

long long ans=1;
for(int i=1;i<=n;i++)
ans*=x;//x乘以n次.

快速幂的方法:

long long Quick_Power(long long x,long long m){
    long long ans=1,mid=x;
    while(m){
        if(m%2) ans=ans*mid;
        mid=mid*mid;
        m=m/2;
    }
    /*
      这种做法,就是利用以乘得的积用来累乘.
      例如 999 二进制为1111100111
      二进制各位权值为x^(2n)
      x^999=(x^512)*(x^256)*(x^128)*(x^64)*(x^32)*(x^4)*(x^2)*x 
    */
    return ans;
}

一个更具时间效率的快速幂


long long Quick_Power(long long x, long long n)
{
    //其实,这种方法也就的第一种方法的扩展.
    //把指数变小,而指数变大.
    //比如2^8==4^4==16^2
    //而如果指数本来就是一个奇数的话,效率就一样了.
    long long ans;
    while(n%2==0)
    {
        n=n/2;
        x=x*x;
    }
    ans=x;
    n=n/2;
    while(n!=0)
    {
        x=x*x;
        if(n%2) ans=ans*x;
        n=n/2;
    }
    return ans;
}

由此可以看到,快速幂的效率余指数还是有关的。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值