二分求幂,快速求解a的b次幂
一个引子
如何求得a的b次幂呢,那还不简单,一个for循环就可以实现!
void main(void) {int a, b;int ans = 1;cin >> a >> b;for (int i = 1; i <= b; i++){ans *= a;}cout << ans; }
那么如何快速的求得a的b次幂呢?上面的代码还可以优化吗?
当然是ok的!下面就介绍一种方法-二分求幂。
二分求幂
所谓二分求幂,即是将b次幂用二进制表示,当二进制位k位为1时,需要累乘a的2^k次方。
下面优化一下上面的代码:
void main(void) {int a, b;int ans = 1;cin >> a >> b;while (b != 0){//当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存if (b % 2 == 1){ans *= a;}a *= a;//每次除以2,转换成二进制位b /= 2;}cout << ans; }
举个例子,当b = 5时,b的二进制为101。
循环次数 | 二进制位 | ans值 | a值 | b值 |
0 | 101 | 1 | a | 5 |
1 | 101 | 2 | a2 | 2 |
2 | 101 | 2 | a4 | 1 |
3 | 101 | 32 | a16 | 0 |
从上表我们可以直观的看出5次幂就可以转换为(2^0+2^2),即a的5次幂就转变为a的(2^0+2^2)次幂,即a的2^0与a的2^2的乘积。
再来个例子-巩固
此题来源于九度教程“人见人爱A^B”。
题目描述:
求A^B的最后三位数表示的整数。
输入:
输入数据包含多个测试实例,每个实例占一行,由两个正整数a和b组成,其中(1<=a,b<=10000),如果a = 0,被= 0,则表示输入数据结束,不做处理。
输出:
对于每个测试实例,输出a^b的最后三位表示的整数,每个输出占一行。
样例输入:
2 3
12 6
6789 10000
0 0
样例输出:
8
984
1
对于这道题,完全可以用上面的二分求解方法,可以仿照上面的代码进行实现。但是有一点需要注意的是,我们不肯能定义一个整型变量或者long long类型的变量取保存如样例给出的数据a = 6789,b=10000,a^b的计算结果。因为数字太庞大了,在整数范围内是无法表示的。所以我们可以只保存每次计算结果的后三位,因为最终结果的后三位取决于其中间值的后三位。
好吧,给出代码:
void main(void) {int a, b;while ((cin >> a >> b)){int ans = 1;if (a == 0 && b == 0)break;while (b != 0){//当二进制位k位为1时,就累加a的2^k次方if (b % 2 == 1){ans *= a;ans %= 1000;}a *= a;a %= 1000;//每次除以2,转换成二进制位b /= 2;}cout << ans;}}
二分求幂,快速求解a的b次幂相关推荐
- 快速幂----快速求解底数的n次幂
目录 一.快速幂 1.问题的引入 2.快速幂的介绍 3.核心思想 4.代码实现 二.Pow(x, n) 1.题目描述 2.问题分析 3.代码实现 三.猴子碰撞的方法数 1.题目描述 2.问题分析 3. ...
- 大数问题(循环求余/快速幂求余/快速幂问题)
大数问题 1.大数求余问题 解题思路 1.1循环求余O(n)O(n)O(n) 1.2.快速幂求余O(logn)O(\log n)O(logn) 2.快速幂问题 解题思路 1.大数求余问题 在仅使用i ...
- 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )
[每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...
- 根据LTI性质快速求解零状态响应微分方程
系统的判定 认识一个系统的属性,普遍从判断其线性.时不变性.因果性入手. 线性性质: 包括齐次性 e(t)→H→r(t)e(t)→H→r(t)e(t)→H→r(t) ke(t)→H→kr(t)ke(t ...
- 分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根
编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后七位数字为止,并将求出的近似结果与理论值2cos20 相比较,二分法的初始迭代区间 ...
- HDU2289_Cup_二分求圆台体积
题目大意: 一个圆台型的杯子,告诉你杯子的水的体积,要求水的高度. 解题思路: 将水的高度作为x,然后化简出f(x)方程,二分求x,至于圆台的体积公式:v = pi ...
- 快速幂(快速幂取余)
引入公式 (a*b) %c = ((a % c)*(b % c)) %c 普通求幂的解法 public static int pow(int x,int n) {int result = 1;for ...
- 一般筛法求素数+快速线性筛法求素数
一般筛法求素数+快速线性筛法求素数 标签: 正则表达式算法优化扩展c 2010-08-22 01:28 28738人阅读 评论(8) 收藏 举报 分类: 算法学习资料(5) 版权声明:本文为博主原 ...
- python猜数字游戏简单-python猜数字游戏快速求解解决方案
python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...
最新文章
- 利用OpenCV求取图像的重心
- 7——ThinkPhp中的响应和重定向:
- 绅士计算机乐谱之谦,绅士(简单钢琴独奏版)
- boost::detail::atomic_count相关的测试程序
- linux版azure应用服务,【应用服务 App Service】解决无法从Azure门户SSH登录问题
- Python 执行 shell命令 的几个方法小结
- canvas笔记-canvas基本用法
- Kubernetes中的nodePort,targetPort,port的区别和意义(转)
- Python爬取哔哩哔哩实时直播弹幕
- 产业智能化的大江大河,需要AI安全这样守护
- 数字化转型指数2020DTI
- 从零搭建移动H5开发项目实战
- python基础 // 与 / % 的区别
- Java面试题集(1-50)
- 工业企业如何转型与升级?2022年我国6部门联合出台《工业能效提升行动计划》具体申报条件及认定好处如下
- C# Aplayer开发笔记(一)
- linux ntp时间立即同步命令_Linux系统时间同步方法小结
- IPV6_PPPOE服务器搭建
- stata读入dta乱码时的操作
- 华为手机日历同步win10日历