快速幂算法 Pow(x,n)函数的实现_20230515

news/2024/7/5 4:38:04

快速幂算法 Pow(x,n)函数的实现

  1. 前言

如果要实现x的整数n次幂(xn),那么可以采用不同的策略,最直观和简单的算法就是利用递归或迭代把n个x连续相乘起来,从而获得幂乘结果。显而易见,此算法至少需要O(n)次运算,n比较大的情况下,则运算效率较低,且占用储存空间开销大。

鉴于此,算法中需要引入快速幂的计算模式,先看一个具体的例子,给定n=10的情况下,进行推理计算过程,

1->x->x2->x5->x10

经过仔细观察可发现,如果n次幂为奇数,x=y*y*x, 如果n次幂为偶数,那么x=y*y, 算式中y理解为当前n的前值。

  1. 递归计算

快幂的本质是分治,每次对指数的数值减半,从而最终求得结果。再举一个例子,鉴定要计算x77, 利用二分的分治思想,过程可以分解为:

在这里插入图片描述

  1. 代码实现

代码实现过程中值得学习的一点是,充分利用递归的返回结果进行计算,对递归的进行变量保存,然后再对这个变量进行处理,基本思路是先递归给出结果,然后再利用结果进行相关的计算,最后求出所需要的值。

/**
 * @file quick_power.c
 * @author your name (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2023-05-14
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#ifndef QUICK_POWER_C
#define QUICK_POWER_C
#include "quick_power.h"

double quick_power(double x, int n)
{
    long N;
    N=n;
    return (N >= 0 ? quick_power_aux(x, N) : 1.0 / quick_power_aux(x, -N));
}

double quick_power_aux(double x, long n)
{
    //Apply the tail processing mode

    double y;

    if(n==0)
    {
        return 1.0;
    }
    else
    {
        y=quick_power_aux(x,n/2);

        return (n%2==0 ? y*y:y*y*x);
    }
}

#endif

  1. 非递归的计算

在这里插入图片描述

  1. 非递归的代码实现

对于非递归的过程,主要是对幂指数进行位运算操作处理,通过位运算操作,最终求得所需结果。

/**
 * @file quick_power.c
 * @author your name (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2023-05-14
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#ifndef QUICK_POWER_C
#define QUICK_POWER_C
#include "quick_power.h"

double quick_power(double x, int n)
{
    long N;
    N=n;
    return (N >= 0 ? quick_power_aux(x, N) : 1.0 / quick_power_aux(x, -N));
}

double quick_power_aux(double x, long n)
{
    double res=1.0;

    double base=x;

    while(n>0)
    {
        if(n&1==1)
        {
            res=res*base;
        }

        base*=base; //base will get powered

        n>>=1;
    }

    return res;
}



#endif

  1. 小结

通过对快幂算法学习,深入理解了对递归返回值的在处理方法,某种意义上,可以理解为“后序”处理的过程。

参考资料:

50. Pow(x, n) - 力扣(Leetcode)


http://lihuaxi.xjx100.cn/news/1133172.html

相关文章

C语言CRC-16 CCITT格式校验函数

C语言CRC-16 CCITT格式校验函数 CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数。 不同同应用规范通过…

Javajdk8新特性中lambda 详解

Java 8 开始支持 lambda 表达式,是 Java 编程语言中对函数式编程的一种支持。Lambda 表达式也被称为闭包或匿名函数,可以让开发者轻松地写出简单而强大的代码,并带来显著的性能优势和更好的可读性。本文将详细介绍 Java Lambda 的概念、语法、…

怎样实现RPC框架

随着微服务架构的盛行,远程调用成了开发微服务必不可少的能力,RPC 框架作为微服务体系的底层支撑,也成了日常开发的必备工具。当下,RPC 框架已经不仅是进行远程调用的基础工具,还需要提供路由、服务发现、负载均衡、容…

九耶丨阁瑞钛伦特-springboot(一)

Spring Boot是一种基于Spring框架的快速应用开发框架。相比于传统的Spring框架,Spring Boot具有更加简洁明了的配置方式,可以帮助开发者快速搭建和部署项目,提高开发效率。 在工程技术领域,快速响应市场需求是企业发展的关键。传…

计算机网络 | 五种I/O模型

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

什么是独享数据库(Database per Microservice)?解决了什么问题?

独享数据库(Database per Microservice)是一种微服务架构模式,涉及为每个微服务创建单独的数据库。在这种模式下,每个微服务都有自己的数据库,这允许更大的可扩展性、灵活性和自治性。 使用这种模式,每个微…

[day28]算法训练

房屋偷盗 解题思路 动态规划,创建一个数组dp,dp[i]表示偷到第i家时最大的金额,由于偷到相邻两家时,报警器会进行报警,所以有对于dp[i]有两种可能:第一种不偷第i家,则结果为dp[i-1],第二种偷第…

设计模式-职责链模式

职责链模式 文章目录 职责链模式什么是职责链模式为什么要用职责链模式如何使用职责链模式总结 什么是职责链模式 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上…