快速幂
来源:互联网 发布:sql查询语句实例 编辑:程序博客网 时间:2024/05/24 23:13
快速幂
快速幂顾名思义,就是快速计算某个数的多少次幂(即a的b次方)。一般的,我们通常采用连乘的方式求解此类问题,时间复杂度为O(N)。但是,当a,b都比较大时,如何快速的求出它的值呢?采用快速幂的方式可以将时间复杂度变成 O(log₂N)。
快速幂原理:(位操作)将指数b化为二进制后计算
例如:求a^15
15化为二进制为1111,即15=2^3+2^2+2^1+2^0;
那么a^15=a^(2^3+2^2+2^1+2^0)=a^(2^3)*a^(2^2)*a^(2^1)*a^(2^0),
则求a^15值转化为求a^(2^3)*a^(2^2)*a^(2^1)*a^(2^0)的值。
而在位运算中,有两个运算恰好可以做到这些,b and 1(b&1就是取b的二进制最末位);b shr 1(b>>=1就是去掉b的二进制最末位)
常规方法求a^b
#include<cstdio>#include<iostream>using namespace std;//常规方法计算a^blong long POW(long long a,long long b){ long long s=1; while(b--) s*=a; return s;}int main(){ long long a,b; scanf("%I64d%I64d",&a,&b); printf("%I64d\n",POW(a,b)); return 0;}
快速幂求a^b
#include<cstdio>#include<iostream>using namespace std;//快速幂求a^blong long POW(long long a,long long b){ long long r=1,base=a; while(b!=0) { if(b&1)//取b的二进制末位 r*=base; base*=base; b>>=1;//去除b的二进制末位 } return r;}int main(){ long long a,b; scanf("%I64d%I64d",&a,&b); printf("%I64d\n",POW(a,b)); return 0;}
0 0
- 快速矩阵快速幂
- 快速幂,快速幂取模
- 快速幂 + 快速幂取模
- 快速幂 快速幂取模
- 快速幂&&快速乘法
- 快速幂&快速乘
- 快速幂 快速乘法
- 快速幂 快速幂取模
- 快速幂+快速乘法
- 【快速幂】【快速幂取模】
- 快速乘法-快速幂
- 快速乘/快速幂/矩阵快速幂
- 快速乘 快速幂 矩阵快速幂
- 快速幂,快速幂取模,矩阵快速幂
- 快速幂
- 快速幂
- 快速幂
- 快速幂
- Liv555简单移植
- STM32F429 Discovery 开发板USART乱码问题,解决过程
- Linux 下stat和access函数
- 与大家讨论如何用opencore amr在iOS上decode(已解决)
- 阿里巴巴面经
- 快速幂
- windows下互斥量的使用
- 【iOS开发之Objective-C】单例的创建
- SQL相关问题的解决_20150730
- Linux Centos 配置防火墙
- 静态代理模式
- hdoj 1896 Stones (优先队列)
- Ubuntu 1204 升级到 1404
- android的测试方法,