快速幂

核心思想:每次迭代都尽可能的将指数减半,来有效减小底数相乘的次数。

传统的幂运算pow(x, y)过程为进行y次乘x运算。

如果一个幂运算的值数太大,传统的求幂运算会进行大量的循环,效率很低。

快速幂核心思想是每一次都将指数分成两半,而相应的底数做平方运算。这能有效的将指数快速变小,需要执行的循环次数也大大减小。

对于一个幂运算pow(3, 10)

一开始的计算方式为pow(3, 10)
经过一次快速幂处理,指数减半底数平方,变成了
pow(9, 5)
现在指数变成了一个奇数,不能直接平分,我们拿出一个1来,剩下的部分变成了偶数4,也就是
pow(9, 4) * pow(9, 1)
而对前面这一部分可以进行一次快速幂处理,现在就变成了
pow(81, 2) * pow(9, 1)
再对pow(81, 2)进行快速幂处理,最终变成了
pow(6561, 1) * pow(9, 1)

我们可以发现,在进行快速幂处理的时候,如果指数为偶数,可以直接进行处理,如果指数为奇数,我们可以将指数拆分为1和一个偶数,其中指数为1的部分就不用再进行处理了。对于指数为偶数的部分可以继续进行快速幂处理,直到所有的指数都变成了1,也就无法再进行快速幂处理了。所有的指数为1的幂运算相乘即为最终的结果。

示例代码:

//非递归版本
double fastPow(double x, int n) {
    double res = 1;
    while(n>0) {
        //当指数为奇数时,可以拆分出一个指数为1的幂运算,我们直接将其乘到res即可
        if(n&1) {
            res *= x;
        }
        //底数平方
        x *= x;
        //指数右移一位(如果原本为奇数,那这个效果相当于-1并除2)
        n >>= 1;
    }
    return res;
}
//递归版本
double fastPow(double x, int n) {
    if(n == 0) {
        return 1;
    }
    //底数平方,指数右移一位(如果原本为奇数,那这个效果相当于-1并除2),并且如果原本的指数为奇数,还要再乘x,否则乘1
    return fastPow(x*x, n>>1) * (n&1 == 1 ? x : 1);
}

Original: https://www.cnblogs.com/shiruyanhai/p/16387469.html
Author: 诗如沿海
Title: 快速幂

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608657/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring(十二):使用JavaConfig实现配置

    上一篇文章我们学习了使用注解开发,但还没有完全脱离xml的配置,现在我们来学习JavaConfig配置来代替xml的配置,实现完全注解开发。 下面我们用一个简单的例子来进行学习。 …

    Java 2023年6月15日
    090
  • Day6-笔记(数组、稀疏数组、冒泡排序、内存分析-堆-栈)

    数组的定义: 数据类型 [] 数组名 数组的四个基本特点: 1、长度确定,不可变,如果越界则报 ArrayIndexOuttoBoundsExpection 2、类型相同。数组是相…

    Java 2023年6月6日
    094
  • 7、线程状态

    线程状态5状态 新建 new 就绪 start() 运行 cpu调度 阻塞 blocked 停止 stop package com.testthread1; /** * 1、建议线…

    Java 2023年6月8日
    063
  • JS使用BLOB方式下载Excel导致文件损坏的问题解决

    这两天写一个后台生成Excel返回前端下载的功能,遇到了一个问题,记录一下。 前端点击下载按钮,文档损坏,但是使用Postman调用下载,文档却是正常的。 exportExcel(…

    Java 2023年6月9日
    066
  • Spring(一)——下载与测试

    Spring(一)——下载与测试 安装jar包 网页输入spring.io回车 测试案例 新建一个普通的Java工程 导入以下jar包 ​ commons-logging-1.2….

    Java 2023年6月16日
    068
  • 设计模式—原型模式

    类型:创建型 目的:通过拷贝快速创建相同或相似对象。 接下来我们看一个需要改进的案例。 优化案例 话不多说,先来看一个创建相同或相似对象的传统写法。 public class De…

    Java 2023年6月7日
    065
  • springboot整合三 共享session,集成springsession

    Mave依赖 参数配置 2.1 redis 配置: 2.1 若使用yml文件,则如下配置 设置Redis支持的Spring Session 3.1 方案一 基于springboot…

    Java 2023年5月30日
    066
  • 3.BIO的多发和多收机制

    1.如何实现客户端多次发消息,服务端多次接收的情况呢 1.服务端 /** * 目&#…

    Java 2023年6月5日
    064
  • 05 Java中的输入、输出流

    输入输出流 内容概括: 存在java.io包中 所有输入流都是抽象类InputStream(字节输入流)和抽象类Reader(字符输入流)的子类。 所有输出流都是抽象类Output…

    Java 2023年6月9日
    065
  • JDBC

    接口 接口:API。 规范。 定义方法签名。 接口和抽象了的意义上的区别。 抽象类是类,抽象类的目的就是让其他类来继承的。 只要继承从意义上来说就要说通 is a。 接口更趋向于功…

    Java 2023年6月7日
    095
  • 顺序结构(Java)

    基本介绍 Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一字一句执行 顺序结构是最简单的算法结构 语句与语句之间,框与框之间是按照从上到下的顺序进行,它是由若干个依次…

    Java 2023年6月9日
    054
  • IDEA使用JDBC链接MySql(java编程)

    1、在Maven的pom.xml文件中引入MySql的驱动 2、idea(版本:2021.2.2)JDBC链接MySql数据库 3、编写JDBC代码 : Original: htt…

    Java 2023年6月7日
    056
  • swing 监听器常用方法

    java Swing事件监听器 动作事件监听器ActionListener 添加/删除方法 addActionListener()、removeActionListener() 接…

    Java 2023年6月5日
    077
  • 设计模式 — Flyweight(享元模式)

    享元模式(Flyweight) 运用共享技术有效地支持大量的细粒度对象 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行是代价——主要指内…

    Java 2023年6月16日
    068
  • Ubuntu 安装 Nginx

    安装前可以先检查一下有没有,再选择是否要安装 卸载 Nginx 删除除了配置文件以外的所有文件。 sudo apt-get remove nginx nginx-common 删除…

    Java 2023年6月14日
    069
  • Spring Cloud中Feign如何统一设置验证token

    代码地址:https://github.com/hbbliyong/springcloud.git 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将toke…

    Java 2023年5月30日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球