Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

题目

实现 pow(x, n) ,即计算 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
  • n 是一个整数
  • 要么 x 不为零,要么 n > 0
  • -104 <= xn <= 104

解题思路

1.题目要求我们实现 pow(x, n) 函数,首先我们来学习一下什么是快速幂。

快速幂算法的本质是分治算法。举个例子,如果我们要计算 x^{64},我们可以按照:

的顺序,从 x 开始,每次直接把上一次的结果进行平方,计算 6 次就可以得到 x^{64} 的值,而不需要对 x 乘 63 次 x。

这个时候你可能会有疑问,如果在 pow(x,n) 中 n 不会恰好等于一次的结果进行平方怎么办?

当然我们还是会发现一个规律,那就是在将 n 化为二进制表达式后,我们需要相乘的就是在二进制中位数为1的地方,举个例子: x^13

将13化为二进制表达式后,我们可以发现它的1,4,8位为 1 。

所以x^13就等于:

所以在n > 0 时我们需要判断二进制为 1 的位数(也就是让 n % 2 ),若为 1 (就表示最低位为1)我们就需要乘 x,然后令 n = n/2(将已经判断过的最后一位去除也就是让1101变为110),让 x = x * x(就是将x变为x^2),然后再进行判断二进制的第二位是否为1,直到n = 0;

2.当n等于负数时,我们只需要令x = 1 / x 即可,然后令 n = -n;这时我们要重新设置一个long类型的变量y,因为当 n = -2147483648时,-n 会超出 int类型。再上述操作完成后,利用正数的计算方法进行计算即可。

代码实现

java 复制代码
class Solution {
    public double myPow(double x, int n) {
        double sum = 1;
        long y = n;
        if(y < 0){
            y = -y;
            x = 1 / x;
        } 
        while(y > 0){
            if(y % 2 != 0){
                sum = sum * x;
            }
            y = y / 2;
            x = x * x;
        }
        return sum;

    }
}

测试结果

相关推荐
wearegogog1237 小时前
基于 MATLAB 的卡尔曼滤波器实现,用于消除噪声并估算信号
前端·算法·matlab
韩师学子--小倪7 小时前
fastjson与gson的toString差异
java·json
一只小小汤圆7 小时前
几何算法库
算法
Drawing stars7 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
Evand J7 小时前
【2026课题推荐】DOA定位——MUSIC算法进行多传感器协同目标定位。附MATLAB例程运行结果
开发语言·算法·matlab
nbsaas-boot7 小时前
SQL Server 存储过程开发规范(公司内部模板)
java·服务器·数据库
行百里er8 小时前
用 ThreadLocal + Deque 打造一个“线程专属的调用栈” —— Spring Insight 的上下文管理术
java·后端·架构
leo__5208 小时前
基于MATLAB的交互式多模型跟踪算法(IMM)实现
人工智能·算法·matlab
忆锦紫8 小时前
图像增强算法:Gamma映射算法及MATLAB实现
开发语言·算法·matlab
玄〤8 小时前
黑马点评中 VoucherOrderServiceImpl 实现类中的一人一单实现解析(单机部署)
java·数据库·redis·笔记·后端·mybatis·springboot