请享用美味的快速幂算法-通俗易懂版

这篇具有很好参考价值的文章主要介绍了请享用美味的快速幂算法-通俗易懂版。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、算法整体思路

第1步

  按照最直接、最好理解的方式看,2的n次幂是n个2相乘,即有如下公式

请享用美味的快速幂算法-通俗易懂版

  例如:

请享用美味的快速幂算法-通俗易懂版

第2步
  然而为了节省大量时间,通过简单的思考和严格数学推理,我们不难理解以下结论:
  1.偶数幂的情况:
    通过幂函数运算法则,有2n=(2n/22,即有如下等式:

请享用美味的快速幂算法-通俗易懂版

    例如24 的计算过程如下所示:

请享用美味的快速幂算法-通俗易懂版

    得到上面的表达式后,22是不是可以继续按照这个思想分解下去?of course!现在只是举了一个4次方的例子,我们可以从此得到启发,发现求n次幂最终可以归结为不断的重复这个分解的一个过程,直到幂不能分解(幂为0了)才停下来。

    由此,上述过程可以描述为一个递归过程,递归基(递归结束条件)为”幂等于0“。得到以下递归表达式:

请享用美味的快速幂算法-通俗易懂版

  小插叙:

    解释第二种情况前,有必要说明以下内容,这也是为什么第二种情况存在的原因:

    如果n是奇数,我们知道,在计算机中,n/2会舍去小数,这样如果继续按照上述第一步的方法分解,逆推回去,会发现最终得到的幂是n-1;不信,且看下例

请享用美味的快速幂算法-通俗易懂版

 

  2.奇数幂的情况:

    好了,现在可以引出第二种情况,就是奇数幂的情况。我们要求得奇数幂的结果,可以从继续步骤1,即按照偶数幂的求法求出最终结果,再附加一个条件是,什么条件呢?

    就是在原来的结果上乘上一个2,原因我相信在插叙中已经说的很明白了,它少了1次幂,现在是在补上这一次幂,即:

请享用美味的快速幂算法-通俗易懂版

   3.最终递归表达式

    那么到现在,我们可以写出完整的递归表达式了,在偶数幂的递归条件下,附加奇数幂的条件即可,即:

请享用美味的快速幂算法-通俗易懂版

 

第3步

  我们现在对于快速幂的求解思路应当是已经十分清晰了,现在我们来写递归函数(C++):

long long int fastpower(int n){
    if (n == 0)//递归基
        return 1;
    else if (n % 2 == 0)//偶数幂的情况
        return square(fastpower(n / 2));
    else//奇数幂的情况
        return square(fastpower(n / 2)) * 2;
}
long long int square(long long int t){
    return t * t;
}

 

二、上刑
  everybody,现在我们已经完全理清了思路,接下来要把它整成代码吧!

#include<iostream>
using namespace std;

long long int fastpower(int n);//求解快速幂
long long int square(long long int t);//平方

int main(void){

    int n;
    cin >> n;//输入幂
    cout << fastpower(n);

    //固定模块初始线
    cout << endl;
    system("pause");
    return 0;
    //固定模块终止线
}

long long int fastpower(int n){
    if (n == 0)//递归基
        return 1;
    else if (n % 2 == 0)//偶数幂的情况
        return square(fastpower(n / 2));
    else//奇数幂的情况
        return square(fastpower(n / 2)) * 2;
}
long long int square(long long int t){
    return t * t;
}

希望能帮助到你,祝你学有所成!文章来源地址https://www.toymoban.com/news/detail-590449.html

到了这里,关于请享用美味的快速幂算法-通俗易懂版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习算法:UMAP 深入理解(通俗易懂!)

    UMAP 是 McInnes 等人开发的新算法。与 t-SNE 相比,它具有许多优势,最显着的是提高了计算速度并更好地保留了数据的全局结构。降维是机器学习从业者可视化和理解大型高维数据集的常用方法。最广泛使用的可视化技术之一是 t-SNE,但它的性能受到数据集规模的影响,并且正

    2024年02月16日
    浏览(44)
  • 轻松掌握Docker!最新超详细版通俗易懂教程,让你快速成为容器化大师!

    注意,安装社区版,先看上图,标记的部分,需要centos7版本以上的;也就是内核版本,必须是3.10及以上,可以通过uname -r命令检查内核版本 也可以通过查看版本确认是否安装 docker --version 主机上的图像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷

    2024年01月23日
    浏览(64)
  • YOLOv3目标检测算法——通俗易懂的解析

    前两篇文章我们讲了下关于 YOLOv1 和 YOLOv2 的原理,有不懂的小伙伴可以回到前面再看看: YOLOv1目标检测算法——通俗易懂的解析 YOLOv2目标检测算法——通俗易懂的解析   作者出于道德问题从 YOLOv3 开始将不再更新 YOLO 系列算法,俄罗斯的一位大佬Alexey Bochkovskiy接过了 YO

    2024年02月08日
    浏览(46)
  • 用通俗易懂的方式讲解:CatBoost 算法原理及案例

    前面已讲了7节,为方便大家学习,我总结在一起,无论是日常实践还是面试使用,都非常方便,喜欢记得收藏 用通俗易懂的方式讲解:逻辑回归模型及案例(Python 代码) 用通俗易懂的方式讲解:决策树模型及案例(Python 代码) 用通俗易懂的方式讲解: 随机森林及案例(

    2024年04月12日
    浏览(40)
  • Matlab自适应滤波算法 LMS小白通俗易懂版

    在学习自适应算法的过程中,入门阶段,学习了LMS算法、NLMS算法,并用Matlab对算法进行了复现。 最小均方(LMS)是一种搜索算法,它通过对目标函数进行适当修改,以便简化梯度向量的计算,由于其计算简单,LMS算法及与之相关的其他算法,已经广泛应用于自适应滤波的各种的

    2024年02月02日
    浏览(49)
  • 七大排序算法——冒泡排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月16日
    浏览(36)
  • 七大排序算法——堆排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月16日
    浏览(31)
  • 七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月03日
    浏览(49)
  • 七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月15日
    浏览(45)
  • 一文搞懂分库分表算法,通俗易懂(基因法、一致性 hash、时间维度)

    最近手上一个系统的访问速度有点慢,老早前用多线程优化过一些接口,将一些复杂 sql 改成单表查询,走内存处理,成功的将 一些 10 多秒的接口优化到 500 ms,但是数据量上来了单表查询效率也有点慢了,不得不考虑进行分库分表了,当然我这里只进行分表,没分库,问就是

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包