快速幂

  • 何为快速幂
  • Code 递归 (非快速幂)
  • Code 递归 (快速幂)
  • Code 迭代 (非快速幂)
  • Code 迭代 (非快速幂)
  • 结语

何为快速幂

例如 a ^ b ,按正常情况下我们需要从1 开始迭代到 b ,若b是较小数据,那对程序的影响微乎其微,若b是上千的数据,从1遍历到 b 需要的时间非常大, 大大降低程序的性能!

快速幂采用分治的策略,一分为二, 二分为四,四分为八…
a ^ b =( (a ^2) ^ (b/ 2) ) * a ^ (b % 2) = (a ^ (b/2))^ 2 * a ^ (b % 2)
= ( a ^ (b/2) * a ^ (b /2) ) * a ^ (b % 2) … 接着不断的分治

例:

我们如何实现快速幂呢?有递归和迭代两种方式!

Code 递归 (非快速幂)

//非快速幂递归求 a ^ b
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int fun1(int a, int b)
{if (b == 1)return a;return fun1(a, b - 1) * a;
}
int main()
{int a, b;a = 7; b = 9;cout << "sum1: " << fun1(a, b) << endl;return 0;
}

Code 递归 (快速幂)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int fun2(int a, int b)
{int t;if (b == 1)//递归结束return a;if (b % 2 == 0){t = fun2 (a, b / 2);return t * t;}else {t = fun2 (a, b / 2);return t * t * a;}
}
int main()
{int a, b;a = 7; b = 9;cout << "sum2: " << fun2(a, b) << endl;return 0;
}

Code 迭代 (非快速幂)

//非快速幂迭代
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{int a, b;a = 7; b = 9;int sum1 = 1;for (int i = 0; i < b; i++)sum1 = a * sum1;cout << "sum1 : " << sum1 << endl;return 0;
}

Code 迭代 (非快速幂)

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{int a, b;a = 7; b = 9;int res = 1;while (b > 0){if (b % 2 == 1) res = res * a;a = a * a;b = b / 2;}cout << "sum2:" << res << endl;return 0;
}

结语

总体来说快速幂的时间要比非快速幂的时间短,当然我测试的数据的b较小,大家可以自行测试较大的b数值,但最终的结果一定的是快速幂的时间短于非快速幂

一般比较大的指数级运算都会采用快速幂

分治法 —— 快速幂相关推荐

  1. 牛客网 牛客小白月赛1 C.分元宵-快速幂

    C.分元宵 链接:https://www.nowcoder.com/acm/contest/85/C 来源:牛客网 这个题就是快速幂,注意特判,一开始忘了特判,wa了一发. 代码: 1 #includ ...

  2. 分糖果(快速幂加前缀和)

    链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 汤姆和杰瑞在一场生日聚会中得到了n袋糖果(n为偶数),糖果袋中分别有2^1,2^2,-,2^n颗糖果,出于礼貌,他们无法将这些已分 ...

  3. 数据结构-挖坑填数+分治法解决快速排序问题(java+c)

    文章目录 一.定义 1.分治法 2.挖坑填数 3.快速排序思想 二.代码实例 1.Java 2.c语言 看到网上有很多的讲解,决定自己整理一遍 首先上定义 一.定义 1.分治法 分治算法的基本思想是将 ...

  4. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  5. 算法设计练习题(1)——分治法

    1. 给定一个数组A,任务是设计一个算法求得数组中的"主元素",即在数组中个数超过数组总元素个数一半的元素.但是数组中元素的数据类型可能是复杂类型,这意味着数组中的元素进能够比较是 ...

  6. 快速幂基础知识(重温学习笔记)

    快速幂 概念背景 方法 分治法求取 非递归求取 概念背景 概念 快速幂,顾名思义,即是快速算底数的n次幂,其时间复杂度为 O(log₂N). 背景 在没有用快速幂之前,有多种方法去算a的b次方再对c取 ...

  7. acm新手小白必看系列之(7)——快速幂取模精讲及例题

    acm新手小白必看系列之(7)--快速幂取模精讲及例题 性质1:(a+b)%m=(a%m+b%m)%m 性质2:(ab)%m=(a%mb%m)%m 给你一个数a,让你求其b次连乘后的结果 当b很小时, ...

  8. 算法设计与分析-《分治法》

    <分治法> 一.分治与递归 二.分治法适应条件与时间复杂度 三.快速幂算法 四.Strassen矩阵乘法 五.合并排序 一.分治与递归 分治的设计思想是: 将一个大问题,分割成一些规模比较 ...

  9. c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...

最新文章

  1. 经典分类:线性判别分析模型!
  2. Spotify敏捷模式详解三部曲第一篇:研发团队
  3. oracle存档模式,Oracle开启归档模式并设置RMAN自动备份策略
  4. c语言怎样在不足n位数的整数前补0,C# String 前面不足位数补零的方法
  5. 组合模式(Composite)
  6. [html] input上传图片怎样触发默认拍照功能
  7. Kotlin静态方法定义和调用
  8. 从一个基础Javascript面试题谈起
  9. 基于共享内存的聊天室服务程序
  10. 联想拯救者Y90关键参数曝光:22GB运存+640GB超大存储
  11. rabbitmq channel对象的方法
  12. [J2ME QA]untrusted domain is not configured问题回应
  13. 【转载+思考】追问泄题之源:命题权寻租打开方便之门
  14. [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.
  15. 软件项目管理案例教程第4版知识清单
  16. 招标采购专业实务课程大纲--刘小明老师
  17. easydarwin 安装_使用EasyDarwin搭建流服务器
  18. 什么是钉钉项目施工和工程管理系统?
  19. 软件质量(六大要素及其分析)
  20. [C++]一个拥有音乐播放器所有基本功能的音乐库

热门文章

  1. 国内物联网平台(7):Ablecloud物联网自助开发和大数据云平台
  2. 如何将彩色证件照调成黑白
  3. 如何进入BIOS设置界面
  4. 运动控制器用c语言怎么编程,三菱运动控制器:Q173HCPU(N)/Q172HCPU(N)系列
  5. go开源网络库nano(6)-hander逻辑
  6. 点到平面的基本距离推导公式
  7. (转)企业级NFS网络文件共享服务
  8. linux内核开启otg,OTG驱动分析(一)
  9. 2017企业网盘年终盘点|机遇与挑战并存,寡头显现
  10. P1010 [NOIP1998 普及组] 幂次方 题解