Python|每日一练|幂函数算法|位运算|>>右移|分析神器pysnooper|日志输出:Pow(x, n)

news2025/1/11 0:07:45

Pow(x, n)

实现 pow(x, n)(https://www.cplusplus.com/reference/valarray/pow/) ,即计算 x n 次幂函数(即,xn)。

示例 1

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2

输入:x = 2.10000, n = 3
输出:9.26100

示例 3

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

 

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • -104 <= xn <= 104

解法参考链接:https://blog.csdn.net/weixin_43813003/article/details/102020554

算法思路:

Pow(x, n)求幕即计算 x n 次幂函数,以计算211次方(2028)为例,常规算法是计算102与原数相乘。

为了简化计算,可以先计算出2×2=4的值,这样211次方可以写成4X4×4X4×4×2(此处多余一个4×2)的形式,再计算4X4=16的值,211次方可以写成16×16×4×2的值,这样计算2X2,4×4,16×164X2的值,只计算了5次即得出结果。

由于计算机执行的是二进制,所以可以通过位运算进行计算。对上述幂算法进行优化,例如判断n是否偶数,可以使用按位与运算符“&”1进行与计算,即判断n的值是否为0即可。而n=n/2(即阶乘每次降低1半)可以使用右移运算符“>>”,n>>=1来操作。

例如:求解2^11

求解变量值记录如下:

--*--Source path:... E:/BLOG/python_day/python_day_code/D.py

--*--Starting var:.. self = <__main__.Solution object at 0x000002025F6867B8>

--*--Starting var:.. x = 2.0

--*--Starting var:.. n = 11

--*--14:02:56.664210 call         5     def myPow(self, x, n):

--*--14:02:56.664210 line         6         if n == 0:

--*--14:02:56.664210 line         8         res ,curr = 1, abs(n)

--*--New var:....... res = 1

--*--New var:....... curr = 11

--*--14:02:56.664210 line         9         while curr > 0:

--*--14:02:56.664210 line        10             if curr & 1 == 1:

--*--14:02:56.664210 line        11                 res *= x

--*--Modified var:.. res = 2.0

--*--14:02:56.664210 line        12             curr >>= 1

--*--Modified var:.. curr = 5

--*--14:02:56.664210 line        13             x *= x

--*--Modified var:.. x = 4.0

--*--14:02:56.664210 line         9         while curr > 0:

--*--14:02:56.664210 line        10             if curr & 1 == 1:

--*--14:02:56.664210 line        11                 res *= x

--*--Modified var:.. res = 8.0

--*--14:02:56.664210 line        12             curr >>= 1

--*--Modified var:.. curr = 2

--*--14:02:56.679833 line        13             x *= x

--*--Modified var:.. x = 16.0

--*--14:02:56.679833 line         9         while curr > 0:

--*--14:02:56.679833 line        10             if curr & 1 == 1:

--*--14:02:56.679833 line        12             curr >>= 1

--*--Modified var:.. curr = 1

--*--14:02:56.679833 line        13             x *= x

--*--Modified var:.. x = 256.0

--*--14:02:56.679833 line         9         while curr > 0:

--*--14:02:56.679833 line        10             if curr & 1 == 1:

--*--14:02:56.679833 line        11                 res *= x

--*--Modified var:.. res = 2048.0

--*--14:02:56.679833 line        12             curr >>= 1

--*--Modified var:.. curr = 0

--*--14:02:56.679833 line        13             x *= x

--*--Modified var:.. x = 65536.0

--*--14:02:56.679833 line         9         while curr > 0:

--*--14:02:56.679833 line        14         if n < 0:

--*--14:02:56.679833 line        16         return  res

--*--14:02:56.679833 return      16         return  res

--*--Return value:.. 2048.0

--*--Elapsed time: 00:00:00.015623

最终得出x = 2048

示例代码:

import pysnooper  #pip install pysnooper后重新加载IDE后使用

@pysnooper.snoop("./log/debug.log", prefix="--*--") #需提前建立目录及文件


class Solution:

    def myPow(self, x, n):

        if n == 0:

            return 1

        res ,curr = 1, abs(n)

        while curr > 0:

            if curr & 1 == 1:

                res *= x

            curr >>= 1

            x *= x

        if n < 0:

            return 1 / res

        return  res

# %%

s = Solution()

print(s.myPow(x = 2.00000, n = 11))

 PS:日志输出神器PySnooper

项目地址:GitHub - cool-RR/PySnooper: Never use print for debugging again

便捷安装:pip install pysnooper

PySnooper-不再使用打印进行调试

官方介绍及DEMO

PySnooper - Never use print for debugging again

PySnooper is a poor man's debugger. If you've used Bash, it's like set -x for Python, except it's fancier.

Your story: You're trying to figure out why your Python code isn't doing what you think it should be doing. You'd love to use a full-fledged debugger with breakpoints and watches, but you can't be bothered to set one up right now.

You want to know which lines are running and which aren't, and what the values of the local variables are.

Most people would use print lines, in strategic locations, some of them showing the values of variables.

PySnooper lets you do the same, except instead of carefully crafting the right print lines, you just add one decorator line to the function you're interested in. You'll get a play-by-play log of your function, including which lines ran and when, and exactly when local variables were changed.

What makes PySnooper stand out from all other code intelligence tools? You can use it in your shitty, sprawling enterprise codebase without having to do any setup. Just slap the decorator on, as shown below, and redirect the output to a dedicated log file by specifying its path as the first argument.

Example

We're writing a function that converts a number to binary, by returning a list of bits. Let's snoop on it by adding the @pysnooper.snoop() decorator:

import pysnooper
@pysnooper.snoop()
def number_to_bits(number):
    if number:
        bits = []
        while number:
            number, remainder = divmod(number, 2)
            bits.insert(0, remainder)
        return bits
    else:
        return [0]

number_to_bits(6)

The output to stderr is:

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

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

相关文章

漫画 | 程序员这次被逼上了绝路!

经过不懈努力&#xff0c;张大胖终于在一个小公司升任经理。张大胖回去翻阅资料&#xff0c;思考了一番&#xff0c;召开会议宣布了一项重要决定。会议室中一阵窃窃私语三天以后&#xff0c;张大胖进行检查&#xff0c;看看自己的第一把火成效如何。张大胖表示很满意&#xff0…

Elasticsearch:轻松处理 CSV 数据

我们知道 CSV 是一种非常流行的数据格式。在 Elastic Stack 中&#xff0c;我们有很多的方式来摄入 CSV 格式的数据。我们可以先看看一个常用的数据摄入数据流&#xff1a; 如上所示&#xff0c;我们可以采取不同的方法来对数据进行摄入。我们可以在不同的地方对数据进行处理。…

【My Electronic Notes系列——逻辑门电路】

目录 序言&#xff1a; &#x1f3c6;&#x1f3c6;人生在世&#xff0c;成功并非易事&#xff0c;他需要破茧而出的决心&#xff0c;他需要永不放弃的信念&#xff0c;他需要水滴石穿的坚持&#xff0c;他需要自强不息的勇气&#xff0c;他需要无畏无惧的凛然。要想成功&…

Java打印流(PrintStream/PrintWriter)

概念 打印流是输出信息最方便的类&#xff0c;注意包含字节打印流PrintStream和字符打印流PrintWriter。打印流提供了非常方便的打印功能&#xff0c;可以打印任何类型的数据信息&#xff0c;例如&#xff1a;小数&#xff0c;整数&#xff0c;字符串。而且永远不会抛出IOExce…

DPDK开发之KNI模块代码实现

DPDK开发之KNI模块代码实现背景KNI实现原理 -- ifreq代码实现总结背景 在DPDK开发的时候&#xff0c;如果有些协议不想处理&#xff0c;只处理关注的协议&#xff0c;可以把其他协议写回内核&#xff0c;让内核处理。此时的DPDK就起到分发的作用&#xff0c;类似一个过滤器。 …

二叉树遍历的C语言实现

1、二叉树 树是n个节点的有限集 每个节点事多有两颗子树的树称为 二叉树 该实验目标实现以下二叉树&#xff1a; 2、二叉树的遍历方案 设&#xff1a; D -- 访问根节点&#xff0c;输出根节点; L -- 递归遍历左二叉树; R -- 递归遍历右二叉树; 二叉树遍历方案…

1145. 二叉树着色游戏

有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中&#xff0c;给出二叉树的根节点 root&#xff0c;树上总共有 n 个节点&#xff0c;且 n 为奇数&#xff0c;其中每个节点上的值从 1 到 n 各不相同。 最开始时&#xff1a; 「一号」玩家从 [1, n] 中取一个值 x&#xff…

软件工程期末考试

软件工程一、简答题&#xff08;5个&#xff09;什么是软件危机&#xff1f;软件危机产生的原因是什么&#xff1f;怎样克服软件危机&#xff1f;你认为摆脱软件危机了吗&#xff1f;软件危机&#xff1a;是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它…

QT opencv 学习day01 安装opencv ,

1. 安装opencv 教程 看这个大佬的链接 &#xff08;实测有用&#xff09;&#xff08;操作简单&#xff09; 链接&#xff1a; (1条消息) 【OpenCV】windows Qt环境搭建_logani的博客-CSDN博客 2. 使用opencv 的注意事项 1.首先要在工程文件 .pro 文件里面 加入路径&#x…

Springboot+Echarts实现数据可视化项目

首先,得明白 springboot 需要写什么内容? 先理解下 MVC 模式! bean 层 也称之为 Dao 层 包括XxxMapper.java(数据库访问接口类),XxxMapper.xml(数据库链接实现);mapper 层 也称之为 model层,模型层,entity层,实体层 就是数据库表的映射实体类,存放POJO对象;servi…

Nginx反向代理与负载均衡

一.何为反向代理? 在介绍反向代理之前&#xff0c;先来了解一下正向代理。 正向代理&#xff1a;如果把局域网外的Internet想象成一个巨大的资源库&#xff0c;则局域网中的客户端要访问Internet&#xff0c;则需要通过代理服务器来访问&#xff0c;这种代理服务就称为正向代…

【前端利器炫酷的CodePen】

前言众所周知&#xff0c;前端是一个很容易将自己的劳动成果呈现出来的一个职位&#xff0c;无论是写1行代码还是写100行代码&#xff0c;都可以通过页面来进行呈现&#xff0c;在工作中的劳作成果也是可以一眼就呈现给客户、用户的。比如一些精美的页面&#xff0c;炫酷的特效…

java集合: ArrayList的底层机制和使用方法

文章目录引言一、Arraylist是什么&#xff1f;二、Arraylist的底层扩容机制(面向面试)1.扩容机制2.扩容过程:3步骤3.注意事项三、使用步骤1.ArrayList类引入2.添加元素3.删除元素4.计算大小5.其他的引用类型6.ArrayList 排序7.ArrayList的遍历方法8.Java ArrayList 方法表格引言…

HTML5+CSS3(六)-全面详解(学习总结---从入门到深化)

目录 CSS简介 CSS概念 为什么需要CSS CSS和HTML之间的关系 语法 学习效果反馈 CSS的引入方式 内联样式&#xff08;行内样式&#xff09; 内部样式 外部样式&#xff08;推荐&#xff09; 导入式&#xff08;了解&#xff09; import和link的区别 学习效果反馈 CSS样式…

代码随想录day53 动态规划

代码随想录day53 动态规划 题392 判断是否子序列 1&#xff0c;与最长公共子序列类似&#xff0c;最后公共子序列的长度要等于s的长度。区别在于当遍历元素不想等的时候&#xff0c;对于字符串s&#xff08;子序列&#xff09;不需要删除&#xff0c;对于字符串t&#xff0c;…

Android---CoordinatorLayout原理

目录 CoordinatorLayout 的作用 CoordinatorLayout 的功能 1 处理子控件之间依赖下的交互 2 处理子控件之间的嵌套滑动 3 处理子控件的测量与布局 4 处理子控件的事件拦截与响应 CoordinatorLayout 下的事件传递机制 CoordinatorLayout 协调者布局。 CoordinatorLayout…

Java基础之序列化与反序列化

序列化&#xff1a;将java对象转化为字节序列的过程。 反序列化&#xff1a;将字节序列转化为java对象的过程。 在进行远程通信时&#xff0c;如果需要传输java对象&#xff1a;发送方需要把java对象转换为字节序列(也就是序列化)&#xff0c;接收方需要将字节序列转换为java对…

PHP设计模式总括篇

系列文章目录 第一章 工厂模式 第二章 抽象工厂模式 第三章 单列模式 第五章 责任链模式 第六章 策略模式 一&#xff0c;定义 “每一个模式描述了一个在我们周围不断重复发生的**问题&#xff0c;以及该问题的解决方案的核心。**这样&#xff0c;你就能一次又一次地使用该方…

都React V18了,还不会正确使用React Hooks吗,万字长文解析Hooks的常见问题

前言 今天主要想说一下react hooks&#xff0c;react hooks是react v16.8 之后引入的API&#xff0c;现在react都已经到V18了&#xff0c;hooks怎么还能不会用呢&#xff1f; 首先hooks引入的目的是给函数式组件增加数据状态管理的能力&#xff0c;同时增加代码的可复用能力。…

C++的类型转换详解

目录前言一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast向上转型向下转型四、RTTI(了解)总结前言 在C语言就已经存在了类型转化&#xff0c;但是其中的一些类型转换存在一些问题&…