整数快速幂
来源:互联网 发布:美工摄影师招聘 编辑:程序博客网 时间:2024/05/29 08:37
快速幂
简介
快速幂的目的就是做到快速求幂,假设我们要求 a^b
,按照平时的算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多
它的原理如下:
假设我们要求 a^b
,那么其实b是可以拆成二进制的,该二进制数第i位的权为 2^(i-1)
,例如当 b=11
时,11的二进制为 1011
, 11=2³×1+2²×0+2¹×1+2º×1
, a^x*a^y=a^(x+y)
,所以 a^11=a^(2^0+2^1+2^3)=a^(2^0)*a^(2^1)*a^(2^3)
因为用到了二进制,所以要用到 &
和 >>
运算符, &
运算用于二进制取位操作,例如 a&1
的结果就是取a的二进制的末位,还可以用来判断奇偶 x&1=0
为偶, x&1=1
为奇; >>
运算是去掉二进制的末位
代码
int poww(int a,int b){ int ans=1,res=a; while(b!=0) { if(b&1!=0)ans*=res; res*=res; b>>=1;///相当于b=b>>1 } return ans;}
代码详解
代码很短,就对于当 b=11
时来说, a^11 = a^(2^0+2^1+2^3) = a^(2^0)*a^(2^1)*a^(2^3) = a^1*a^2*a^8
,相当于二进制的哪一位为1,就需要乘以a的该位的权重次幂,11的二进制为 1011
,第1,2,4位为1,他们对应应该为 a^0,a^2,a^8
,代码中的 if(b&1!=0)ans*=res;
就是将二进制为1的位a的对应次幂,乘到结果上, res*=res;
二进制每进一位,该位对应的幂翻倍,就相当于该位a的对应次幂的结果平方,简明的说,就是让 res
的值为 a^0;a^2;a^4;a^8;a^16;......
快速幂的代码很短很好用,也能减少不少的代码运行时间,所以,再遇见与求幂有关的题目是就优先考虑用快速幂吧
- 整数快速幂
- poj1995- 整数快速幂
- B - 整数快速幂
- 整数快速幂
- 整数快速幂【模板】
- 整数快速幂
- 整数快速幂
- 快速幂(整数)
- 整数快速幂
- 整数快速幂-归纳法
- 矩阵快速幂之整数快速幂
- hdu2817之整数快速幂
- 快速计算整数的幂
- Java大整数快速幂
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
- 整数快速乘法/快速幂+矩阵快速幂
- ZZULIOJ【1090】整数幂【快速幂】
- 整数幂快速取模求法
- win10 wamp 打开报错0xc0000142
- 项目总结及坑点
- Mysql5.7.14-linux版密码忘记解决办法
- php实现短链接系统
- Error:java.lang.NullPointerException: null value in entry: destinationDir=null
- 整数快速幂
- C++语言 输出杨辉三角形 要求输出10行。
- 优化网站性能的6种架构方案
- linux Nginx配置篇:gzip常用参数详解(附使用效果验证过程)
- 传智播客-Java学习笔记day21
- Java——变量类型
- Android -- Looper.prepare()和Looper.loop() —深入版
- ActiveMQ中的消息重发时间间隔和重发次数吗?
- 阶乘因式分解(一) (思维)