非递归快速幂算法

前几天做练习时用到了幂的计算,我没用系统自带的pow,自己写了一下

int x = 5;
int y = 25;
int pow1(int x,int y){
    int m = 1;
    while(y--)
        m*=x;
    return m;
}

这种O(N)效率比较低,能不能把时间复杂度降低到O(logN)呢?
上网搜索了一下快速幂,答案很多,但是…你们这么相互复制真的好吗(╯°Д°)╯┻━┻
好吧,我自己试着写了一下,并整理了一下思路,记录在这里。
首先要介绍一下“>>”这个东西。
c语言程序中x>>=1,如果作用于整数x,就是把x右移一位,把x的二进制值的最后一位丢弃,最高位补0。
实际就是把x的值除以2。在运算结果上等价于x=x/2。

我们拿x^y来介绍快速幂算法。为了避免一个一个x相乘来得出结果,我们将y化为二进制。
比如6的二进制是110。即y=(2^2) *1 + (2^1) *1 + (2^0) *0
这时x^y就被转化为x^(2^2) * x^(2^1) ,而指数是可以很快算出来的。

代码如下

int getX();
int pow(int x,int y);
int x = 5;
int y = 25;
int getX(){
    return pow(x,y);
}
int pow(int x,int y){
    int m=1;
    int base = y;
    while(y!=0){
        if(y&1)  //y&1 同 y%2
            m*=base;
        base*=base;
        y>>=1;
    }
    return m;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值