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

news2024/12/25 0:35:03

快速幂算法 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://www.coloradmin.cn/o/527006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型友好的 API:借助集体智慧构建更好的软件架构

在过去的几个月里,我们一直在探索:如何将大语言模型用于研发效能提升?而随着,我们研究的逐步推进,慢慢进入一些深水区,诸如于:如何将 AI 更好地用于辅助架构设计?基于我们多年的架构…

​目标检测:如何有效实现YOLOv8

本文是一篇实用指南,介绍了如何使用命令行界面和Python来对图像、视频和实时网络摄像头中的物体进行检测。 介绍 目标检测是计算机视觉的一个子领域,主要涉及在图像或视频中以一定的置信度识别和定位物体。识别出的物体通常带有一个边界框,提…

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

如何使用chatgpt生成精美PPT提高工作效率

本教程收集于:AIGC从入门到精通教程 如何快速生成精美PPT提高工作效率 一、ChatGPT生成markdown源代码 二、Mindshow登录/注册 三、导入markd

Redis缓存架构详解

文章目录 Redis缓存结构详解前言Redis 缓存架构redis 和db数据一致性先写db还是写redis如果是先写db,再删除缓存呢&#xff1f;延迟双删 简单的缓存,并发不高,没啥流量简单的缓存,并发高,但是存在redis和 Db 双写不一致,读写并发不一致问题解决方案 1解决方案 2解决方案 3读写锁…

Linux常用命令——iconv命令

在线Linux命令查询工具 iconv 转换文件的编码方式 补充说明 iconv命令是用来转换文件的编码方式的&#xff0c;比如它可以将UTF8编码的转换成GB18030的编码&#xff0c;反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,…

《程序员面试金典(第6版)》面试题 16.22. 兰顿蚂蚁(哈希映射,C++)

题目描述 一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时&#xff0c;网格全白&#xff0c;蚂蚁面向右侧。每行走一步&#xff0c;蚂蚁执行以下操作。传送门 (1) 如果在白色方格上&#xff0c;则翻转方格的颜色&#xff0c;向右(顺时针)转 90 度&#xff0c;并向前移动…

【Vue2.0源码学习】虚拟DOM篇-Vue中的虚拟DOM

文章目录 1. 前言2. 虚拟DOM简介3. Vue中的虚拟DOM3.1 VNode类3.2 VNode的类型3.2.1 注释节点3.2.2 文本节点3.2.3 克隆节点3.2.4 元素节点3.2.5 组件节点3.2.6 函数式组件节点3.2.7 小结 3.3 VNode的作用 4. 总结 1. 前言 虚拟DOM&#xff0c;这个名词作为当下的前端开发人员…

Android Studio Flamingo (火烈鸟) 升级踩坑记录

由于想要验证Compose最新的debug特性&#xff0c;而我目前使用的版本&#xff08;Dolphin 小海豚&#xff09;不支持&#xff0c;查看官网说明需要最新版本&#xff0c;所以不得已进行了一下Android Studio版本升级&#xff0c;过程中遇到一些问题&#xff0c;本文仅做记录。&a…

FPGA驱动WM8731音频收发全网最细讲解 提供2套工程源码和技术支持

目录 1、前言2、WM8731音频解读3、vivado工程1介绍4、vivado工程2介绍5、上板调试验证6、资料获取 1、前言 本文用FPGA驱动WM8731音频芯片&#xff0c;实现音频相关的应用&#xff0c;适用于在校学生做毕业设计、研究生项目开发&#xff0c;也适用于在职工程师做项目开发&…

Ae 首选项:启动和修复

使用“首选项”里面的启动和修复 Start and Repair面板&#xff0c;可以解决 Ae 中的首选项设置问题&#xff0c;而无需更改、删除或者重新进行设置。 启动选项 Startup Options 启用主屏幕 Enable Home Screen 确定是否在启动 Ae 时显示主屏幕。 更改将在下次启动时有效。 显示…

element-plus 问题

对话框内部下拉框会在左上角 在对话框内打开下拉框后点击关闭按钮&#xff0c;尚未关闭的下拉框会在左上角出现&#xff08;或闪现&#xff09; 解决方案&#xff1a; popper-append-to-body 此方法失效&#xff0c;改用 :teleported"false" teleported&#xff1a;…

JDBC和数据库连接池

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/java-tutorial 】或者公众号【AIShareLab】回复 java 也可获取。 文章目录 JDBC 概述基本介绍模拟JDBCJDBC 带来的好处 JDBC 快速入门JDBC 程序编写步骤JDBC 第一个程序 获取数据库连接5种方式方式1…

接入 GPT-4 的 AI 虚拟女友,一周狂挣 50 万!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 随着 ChatGPT 的爆火&#xff0c;互联网上也衍生出不少令人直呼脑洞大开的 AI 应用。 最近&#xff0c;国外一位名为 Caryn Marjorie 的小姐姐搞了个骚操作&#xff0c;基于 GPT-4 调教出来…

Spring Cloud LoadBalancer是什么?

什么是Spring Cloud LoadBalancer Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代 Ribbon。 Spring官方提供了两种负载均衡的客户端&#xff1a; RestTemplate RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTempla…

30从零开始学Java之详解面向对象的7种创建方式

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家介绍了Java中的类及其特点、创建过程等内容&#xff0c;相信你…

【Nginx高级篇】Lua基础语法和OpenResty的安装

目录 一、前言 二、Lua基础语法 hello world 保留关键字 注释 变量 字符串 空值 布尔类型 作用域 控制语句 if-else for循环 函数 赋值 返回值 Table 数组 遍历 成员函数 三、openresty的安装 &#xff08;一&#xff09;预编译安装 &#xff08;二&…

VMware中Ubuntu拓展磁盘容量的两种方式 图形化方式命令行磁盘分区方式(亲测有效简单且详细)linux磁盘分区

文章目录 前言1. 软件设置扩容2. 容量查看3. 容量拓展实现3.1 图形化容量拓展分配3.2 磁盘命令行方式拓展容量3.2.1 确定磁盘挂载目录3.2.2 系统磁盘扩容 4. 分盘扩容TIPS&#xff1a;总结&#xff1a; 前言 在用VMware虚拟机的情况下&#xff0c;一开始分配的容量在使用过程中…

PMP项目管理-[第十二章]采购管理

采购管理知识体系&#xff1a; 规划采购管理&#xff1a; 实施采购&#xff1a; 控制采购&#xff1a; 12.1 规划采购管理 定义&#xff1a;记录项目采购决策、明确采购方法、识别潜在卖方的过程 作用&#xff1a;确定是否从项目外部获取货物或服务.如果是&#xff0c;则还要确…

循环结构程序设计

一、循环结构语句 C语言提供了三种循环语句&#xff08;for语句&#xff09;、while语句和do-while语句。 for语句&#xff1a; for(表达式1 &#xff1b; 表达式2 &#xff1b; 表达式3) {   循环体语句&#xff1b; } for语句的执行过程&#xff1a; 首先计算表达式1。判断…