一个引子

如何求得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次幂相关推荐

  1. 快速幂----快速求解底数的n次幂

    目录 一.快速幂 1.问题的引入 2.快速幂的介绍 3.核心思想 4.代码实现 二.Pow(x, n) 1.题目描述 2.问题分析 3.代码实现 三.猴子碰撞的方法数 1.题目描述 2.问题分析 3. ...

  2. 大数问题(循环求余/快速幂求余/快速幂问题)

    大数问题 1.大数求余问题 解题思路 1.1循环求余O(n)O(n)O(n) 1.2.快速幂求余O(log⁡n)O(\log n)O(logn) 2.快速幂问题 解题思路 1.大数求余问题 在仅使用i ...

  3. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

  4. 根据LTI性质快速求解零状态响应微分方程

    系统的判定 认识一个系统的属性,普遍从判断其线性.时不变性.因果性入手. 线性性质: 包括齐次性 e(t)→H→r(t)e(t)→H→r(t)e(t)→H→r(t) ke(t)→H→kr(t)ke(t ...

  5. 分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根

    编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后七位数字为止,并将求出的近似结果与理论值2cos20 相比较,二分法的初始迭代区间 ...

  6. HDU2289_Cup_二分求圆台体积

    题目大意:          一个圆台型的杯子,告诉你杯子的水的体积,要求水的高度. 解题思路:         将水的高度作为x,然后化简出f(x)方程,二分求x,至于圆台的体积公式:v = pi ...

  7. 快速幂(快速幂取余)

    引入公式 (a*b) %c = ((a % c)*(b % c)) %c 普通求幂的解法 public static int pow(int x,int n) {int result = 1;for ...

  8. 一般筛法求素数+快速线性筛法求素数

    一般筛法求素数+快速线性筛法求素数 标签: 正则表达式算法优化扩展c 2010-08-22 01:28 28738人阅读 评论(8) 收藏 举报  分类: 算法学习资料(5)  版权声明:本文为博主原 ...

  9. python猜数字游戏简单-python猜数字游戏快速求解解决方案

    python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...

最新文章

  1. 利用OpenCV求取图像的重心
  2. 7——ThinkPhp中的响应和重定向:
  3. 绅士计算机乐谱之谦,绅士(简单钢琴独奏版)
  4. boost::detail::atomic_count相关的测试程序
  5. linux版azure应用服务,【应用服务 App Service】解决无法从Azure门户SSH登录问题
  6. Python 执行 shell命令 的几个方法小结
  7. canvas笔记-canvas基本用法
  8. Kubernetes中的nodePort,targetPort,port的区别和意义(转)
  9. Python爬取哔哩哔哩实时直播弹幕
  10. 产业智能化的大江大河,需要AI安全这样守护
  11. 数字化转型指数2020DTI
  12. 从零搭建移动H5开发项目实战
  13. python基础 // 与 / % 的区别
  14. Java面试题集(1-50)
  15. 工业企业如何转型与升级?2022年我国6部门联合出台《工业能效提升行动计划》具体申报条件及认定好处如下
  16. C# Aplayer开发笔记(一)
  17. linux ntp时间立即同步命令_Linux系统时间同步方法小结
  18. IPV6_PPPOE服务器搭建
  19. stata读入dta乱码时的操作
  20. 华为手机日历同步win10日历

热门文章

  1. paip.mysql 5.6 安装总结
  2. Sockets programming in Python
  3. 腾讯微博Android客户端开发——OAuth认证介绍
  4. Grid++Report问题集!
  5. Go 语言:我那么值钱,我骄傲了吗?
  6. 匹配正则_Day233:正则表达式匹配方法 match()
  7. Redis数据库操作指令
  8. Nacos源码DistroConsistencyServiceImpl
  9. Nacos-Nacos和Eureka的对比
  10. HashMap中put方法的过程