快速幂算法:高效计算x^n的奥秘

【原理讲解】

  快速幂算法是指计算xn的时候,将n写为二进制,比如n = 10 -> (1010)2;那么x10 = x8 * x2,不难发现这样x2是可以通过(x4)2 快速算出来的,而x4也可以通过x2 平方后得到,这意味着,只要我们在遍历n的二进制数的时候,顺便维护一个临时变量t,每次循环都让t自身平方,就可以得到遍历的对应位置的0或者1对应要乘的x的幂。

  这样的好处是可以在O(logn)的时间内计算出xn,而不需要O(n)连乘x。

​  为什么是O(logn) ? 因为一个数n的二进制形式的串的长度是O(log2n)级别的。就好比127 = 1111 111,长度是7.

【练习】 leetcode 题号为50的Pow(x, n)。

【分析】先确定结果的符号,如果只有当x是负数,而且|n|为奇数的时候,结果才是负数; 然后n有可能是负数,所以先取绝对值处理,最后看要不要取倒数。

  有几种特殊情况需要特判,x = 0的时候,返回0,n = 0的时候,返回1.

  对于一般的情况使用快速幂即可,即把n(假设是正整数)看做二进制数,遍历它的每一位,如果是1,比如1010,从右往左数的第一个1,对应了2,此时你需要快速获得a2,第二个1,对应8,此时你需要快速获得a8,维护一个数,让自己一直随着遍历平方就好了。

  • 注意,计算的时候x也要开abs。
  • 函数的入参n要开long long,否则取绝对值之后int放不下。

  欢迎大家跟进我的刷题进度,一起进步,持续更新【每日算法】。
leetcode主页:我的leetcode主页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值