快速幂logn的算法

思路

  我们思考下,一个无符号整数42亿 , 给它去对数 , 结果是不是32 . 那么我们可以看出来本身一个数字的二进制表示其实就是对这个数字取log2n, 这个log2n其实这是这个二进制数字的位数.
  在思考下, 4 取以2为底的对数,答案是2,4的二进制位有2位,8同理三位.
  那么,我们求p的m次方,是不是可以转换为求m的那些二进制为1,取这些二进制位为1的值的p次方,最终把所有二进制为1的p的i次方累乘就是结果.

举列子

  2的75次方, 75 1001011 , 第一次求出 2的1次方保存到结果中并与之前结果累乘,第二次求出2的2次方,保存到结果中并与之前结果累乘,第三次求出2的三次方,但有效位不是1跳过,第四次根据2的三次方求出4次方,有效位为1,保存到结果中并与之累乘.
  就是这个思路!!!

代码

/* m^p 次方 log2n*/
int  Fun(int p, int m)
{
    assert(m >= 0);
    int next = 1;
    int ret = 1;
    for (; m!= 0; m >>= 1)
    {
        next = next*p; //每次都要算 p的i次方
        if (m & 1 == 1)
        {
            ret = ret*next; //如果是有效位累乘该p的i次方即可
        }
    }
    return ret;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值