每日一题之数值的整数次方

news2024/11/24 17:20:59

数值的整数次方

描述:
实现函数 double Power(double base, int exponent),求 base 的 exponent 次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
我的思路:直接使用递归,让它每次乘一个它自身。但这存在一个问题,如果这个 e x p o n e n t exponent exponent 是负数怎么办?
一下是参考别人的题解:
方法1:直接运算
不断做累乘,重点是处理负的次方数, x − n = ( 1 x ) n x^{-n}=(\frac{1}{x})^n xn=(x1)n ,所以我们要将 底数转换为相应的分数,再见次方数转换回正数即可。
时间复杂度: O ( n ) O(n) O(n) ,空间复杂度: O ( 1 ) O(1) O(1)

class Solution:
    def Power(self , base: float, exponent: int) -> float:
        # write code here
        # 如果基数是0,那么不管多少次方都是0
        if base == 0:
            return float(0)
        res = base
        # 指数大于0
        if exponent > 0:
            for i in range(exponent-1):
                res *= base
        # 指数等于0
        elif exponent == 0:
            res = float(1)
        # 指数小于0
        else:
            # 将指数换成相反数
            exponent = -exponent
            # 底数换成原底数的-1次方
            base = 1 / base
            # 所有结果已经保留了一次结果
            res = base
            for i in range(exponent-1):
                res *= base
        return res

看了别人的代码进行了一点点精简。

class Solution:
    def Power(self , base: float, exponent: int) -> float:
    	if exponent < 0:
    		base = 1 / base
    		exponent = -exponent
		res = 1.0
    	for i in range(exponent):
    		res *= base
    	return res

方法2:快速幂
使用的是分治思想,分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进行处理。经过分治后的子问题,需要将解进行合并才能得到原问题的解,因此整个分治过程经常用递归来实现。
解题思路:幂运算,我们可以采用快速幂。如果我们要计算 5 10 5^{10} 510 ,常规算法是 5 ∗ 5 = 25 , 25 ∗ 5 = 125 , . . . , 5*5=25, 25*5=125, ..., 55=25,255=125,..., 以此类推,一共经过9次运算,即 n − 1 n-1 n1 次。但是,如果我们考虑: 5 ∗ 5 = 25 ( 二次 ) 5*5=25(二次) 55=25(二次) 25 ∗ 25 = 625 ( 四次 ) 25*25=625(四次) 2525=625(四次) 625 ∗ 625 = . . . ( 八次 ) 625*625=...(八次) 625625=...(八次) ,利用这个二分的思路,运算次数就缩减到 l o g 2 n log_2n log2n 次,公式如下:
x n = { x n 2 ∗ x n 2 n为偶数 x n − 1 ∗ x n为奇数 1 n=0 x^n=\begin{cases} x^{\frac{n}{2}} * x^{\frac{n}{2}}& \text{n为偶数}\\ x^{n-1} * x & \text{n为奇数}\\ 1 & \text{n=0} \end{cases} xn= x2nx2nxn1x1n为偶数n为奇数n=0
举个例子: 2 10 2^{10} 210 的求取过程(图片来自牛客某位大佬的解析,感觉挺不错的,保留截图该图片便于理解)
图片1
时间复杂度: O ( l o g 2 n ) O(log_2n) O(log2n),空间复杂度: O ( 1 ) O(1) O(1)

# 快速幂计算法
def pow(x: float, y: int)->float:
    res = 1
    while y:
        # 位与运算
        if y & 1:
            res *= x
        # 叠加,每次都将
        x *= x
        # 减少乘次数
        # 右移,y值每次减少一半,
        y = y >> 1
    return res
def Power(base: float, exponent: int)->float:
    # 处理负数次方
    if exponent < 0:
        exponent = -exponent
        base = 1 / base
    res = 1.0
    return Power(base, exponent)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/904500.html

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

相关文章

mysql+jdbc+servlet+java实现的学生在校疫情信息打卡系统

摘 要 I Abstract II 主 要 符 号 表 i 1 绪论 1 1.1 研究背景 1 1.2 研究目的与意义 2 1.3 国内外的研究情况 2 1.4 研究内容 2 2 系统的开发方法和关键技术 4 2.1 开发方法 4 2.1.1 结构化开发方法 4 2.1.2 面向对象方法 4 2.2 开发技术 4 2.2.1 小程序开发MINA框架 4 2.2.2 …

[Spring]事务相关

事务隔离级别 Spring 提供了以下五种事务隔离级别&#xff0c;用于控制多个事务之间的相互影响&#xff1a; DEFAULT&#xff08;默认隔离级别&#xff09;&#xff1a; 使用底层数据库的默认隔离级别。通常为数据库的默认隔离级别&#xff0c;如 MySQL 是 REPEATABLE READ&am…

逆向退货售后设计

一&#xff0c;项目背景 退货售后流程&#xff1a;涉及订单&#xff0c;票&#xff0c;款 二&#xff0c;方案一 三&#xff0c;方案二

残差网络实现

代码中涉及的图片实验数据下载地址&#xff1a;https://download.csdn.net/download/m0_37567738/88235543?spm1001.2014.3001.5501 代码&#xff1a; import torch import torch.nn as nn import torch.nn.functional as F #from utils import load_data,get_accur,train i…

只需5分钟,了解常见的四种限流算法

一、计数器算法 在指定周期内累加访问次数&#xff0c;当访问次数达到设定的阈值时&#xff0c;触发限流策略&#xff0c;当进入下一个时间周期时进行访问次数的清零。如图所示&#xff0c;我们要求3秒内的请求不要超过150次&#xff1a; 但是&#xff0c;貌似看似很“完美”的…

[mysql系列] mysql 数据库如何实现事务回滚

这里写自定义目录标题 一、事务回滚二、mysql InnoDB引擎如何实现回滚操作2.1 InnoDB引擎的 undo log2.2 具体实现2.2.1 insert 操作2.2.2 delete 操作2.2.3 update 操作 主要参考资料为&#xff1a;《Mysql 是怎样运行的》 一、事务回滚 根据原子性的定义&#xff0c;一个事务…

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中&#xff0c;我们提到了MVCC&#xff08;Multi-Version Concurrency Control)多版本并发控制&#xff0c;是通过undo log来实现的。那具…

MATLAB | 七夕节用MATLAB画个玫瑰花束叭

Hey又是一年七夕节要到了&#xff0c;每年一次直男审美MATLAB绘图大赛开始hiahiahia&#xff0c;真的这些代码越写越不知道咋写&#xff0c;又不想每年把之前的代码翻出来再发一遍&#xff0c;于是今年又对我之前写的老代码进行了点优化组合&#xff0c;整了个花球变花束&#…

计算机网络-物理层(三)-信道的极限容量

计算机网络-物理层(三)-信道的极限容量 当信号在信道中传输失真不严重时&#xff0c;在信道的输出端&#xff0c;这些信号可以被识别 当信号在信道中&#xff0c;传输失真严重时&#xff0c;在信道的输出端就难以识别 造成失真的因素 码元传输速率信号传输距离噪声干扰传输媒…

8.4.tensorRT高级(3)封装系列-infer推理封装,输入输出tensor的关联

目录 前言1. infer封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-infer推理封装&#xff0c;输入输出…

思维进化算法(MEA)优化BP神经网络

随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜…

嵌入式设备应用开发(boost库应用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌入式开发过程中不可避免在很多情况下,需要使用到posix的api函数。一方面,这些api函数确实可以帮助我们解决一些问题;但是另外一方面,因为平台的差异,如果一段时间不做嵌入式…

Java集合利器 Map Set

Map & Set 一、概念二、Map三、Set下期预告 一、概念 Map和Set是一种专门用来进行搜索的数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。它们分别定义了两种不同的数据结构和特点&#xff1a; Map&#xff08;映射&#xff09; &#xff1a;Map是一种键值对&…

Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析

文章目录 1. BeanFactoryPostProcessor 概览1.1 解读 BeanFactoryPostProcessor1.2. 如何使用 BeanFactoryPostProcessor 2. BeanDefinitionRegistryPostProcessor 深入探究2.1 解读 BeanDefinitionRegistryPostProcessor2.2 BeanDefinitionRegistryPostProcessor 的执行时机2.…

Redis+SpringBoot企业版集群实战------【华为云版】

目录 安装 复制及集群 bgsave rdb aof SpringBoot+Redis操作

斯特林近似(Stirling‘s approximation)

斯特林公式&#xff08;Stirling’s approximation&#xff09;是一条用来取n的阶乘的近似值的数学公式。一般来说&#xff0c;阶乘的计算复杂度为线性。当要为某些极大的n求阶乘时&#xff0c;常见的方法复杂度不可接受。斯特林公式能够将求解阶乘的复杂度降低到对数级。而且&…

在云服务器上安装Jenkins

说明&#xff1a;Jenkins是一个部署项目的平台&#xff0c;通过Jenkins可以省去从项目开发–>部署项目之间的所有流程&#xff0c;做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前&#xff0c;先要在云服务上安装JDK、Maven、Git&#x…

SpringAOP原理:手写动态代理实现

0、基础知识 AOP我们知道&#xff0c;是在不修改源代码的情况下&#xff0c;为代码添加一些新功能的技术。通过动态代理&#xff0c;可以在不修改原始类代码的前提下&#xff0c;对方法进行拦截和增强。 动态代理常用于在不改变原有业务逻辑的情况下&#xff0c;对方法…

Dockerfile部署LNMP

文章目录 一、项目模拟1. 项目环境2. 服务器环境3. 任务需求 二、Linux 系统基础镜像三、Nginx1. 建立工作目录2. 编写 Dockerfile 脚本3. 准备 nginx.conf 配置文件4. 生成镜像5. 创建自定义网络6. 启动镜像容器7. 验证 nginx 三、Mysql1. 建立工作目录2. 编写 Dockerfile3. 准…

CompletableFuture总结和实践

CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程&#xff0c;与主线程分隔开&#xff0c;并在上面运行一个非阻塞的任务&#xff0c;然后通知主线程进展&#xff0c;成功或者失败。 一、概述 1.CompletableFuture和Future的区别&…