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

这篇具有很好参考价值的文章主要介绍了每日一题之数值的整数次方。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数值的整数次方

描述:
实现函数 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 的求取过程(图片来自牛客某位大佬的解析,感觉挺不错的,保留截图该图片便于理解)
每日一题之数值的整数次方,python学习之路,python
时间复杂度: O ( l o g 2 n ) O(log_2n) O(log2n),空间复杂度: O ( 1 ) O(1) O(1)文章来源地址https://www.toymoban.com/news/detail-661005.html

# 快速幂计算法
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)

到了这里,关于每日一题之数值的整数次方的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python:每日一题之矩阵拼接

    问题描述 已知 3 个矩形的大小依次是 a1​×b1​,a2​×b2​ 和 a3​×b3​ 。 用这 3 个矩形能拼 出的所有多边形中, 边数最少可以是多少? 例如用 3×2 的矩形(用 A 表示)、 4×1 的矩形 (用 B 表示) 和 2×4 的矩 形(用 C 表示)可以拼出如下 4 边形。   例如用 3×2 的矩形 (用

    2024年02月11日
    浏览(38)
  • 【快速幂】剑指 Offer 16. 数值的整数次方

    实现 pow(x, n) ,即计算 x 的 n 次幂函数(即, x n x^n x n )。不得使用库函数,同时不需要考虑大数问题。 提示: − 100.0 x 100.0 -100.0 x 100.0 − 100.0 x 100.0 − 2 31 = n = 2 31 − 1 -2^{31} = n = 2^{31}-1 − 2 31 = n = 2 31 − 1 − 1 0 4 = x n = 1 0 4 -10^4 = x^n = 10^4 − 1 0 4 = x n = 1 0 4 对于 x n x^n x n

    2024年02月02日
    浏览(37)
  • 每日一题之判断子序列

    题目链接 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如, \\\"ace\\\" 是 \\\"abcde\\\" 的一个子序列,而 \\\"aec\\\" 不是)。 示例 1: 示例 2: 提示: 0 = s.length = 100 0 = t.le

    2024年02月16日
    浏览(43)
  • LeetCode每日一题之 复写0

    目录 题目介绍: 算法原理: 特殊位置处理: 代码实现: 题目链接:. - 力扣(LeetCode) 这种对数组元素进行修改,移动的题目我们仍然可以使用双指针法,不过我们按照常规思路从左到右处理数组,不难发现如下这种问题: 当cur指向1时,让dest下一个元素复写cur指向的元素

    2024年04月23日
    浏览(58)
  • 每日一题之最长连续递增序列

    题目链接 给定一个未经排序的整数数组,找到最长且 连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r ( l r )确定,如果对于每个 l = i r ,都有 nums[i] nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

    2024年02月12日
    浏览(39)
  • 每日一题之常见的排序算法

    排序是最常用的算法,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、希尔排序和归并排序。除此之外,还有桶排序、堆排序、基数排序和计数排序。 1、冒泡排序 冒泡排序就是把小的元素往前放或大的元素往后放,比较的是相邻的两个元素。 时间复杂度:

    2024年02月13日
    浏览(41)
  • 每日一题之打家劫舍

    题目链接 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。 给定一个代表每个房屋存放金额的非负整数数组,计算

    2024年02月08日
    浏览(43)
  • 【c语言】每日一题之汉诺塔类型

    大佬们,我又回来了,最近也在忙自己的学业,忙着生活对线,也参加了今年的蓝桥杯其他的组,发现今年太难了 ,摆烂了。但我想到了读者你们,从今天开始继续更新博客。通过写一篇我随便写的有趣的题,打开今年的博客之旅。 BC161 大吉大利,今晚吃鸡 糖和抖m在玩个游

    2023年04月16日
    浏览(33)
  • 每日一题之打家劫舍II

    题目链接 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报

    2024年02月08日
    浏览(42)
  • 每日一题之两个字符串的删除操作

    题目链接 给定两个单词  word1  和  word2  ,返回使得  word1  和   word2  ** 相同 所需的 最小步数 。 每步  可以删除任意一个字符串中的一个字符。 示例 1: 示例  2: 提示: 1 = word1.length, word2.length = 500 word1  和  word2  只包含小写英文字母 我们可以定义一个二维数组 dp ,

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包