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;

    }
}

测试结果

相关推荐
中微极客15 分钟前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek35 分钟前
前缀和实现Kogge-Stone算法
数据结构·算法
元Y亨H1 小时前
开发者必须掌握的十大核心算法
算法
元Y亨H1 小时前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法
元Y亨H1 小时前
数据结构与算法的通俗指南
数据结构·算法
2301_764441332 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
林泽毅2 小时前
PyTRIO快速入门(二):Datum构建
人工智能·算法·产品
captain3762 小时前
多线程线程安全问题
java·java-ee
keep intensify2 小时前
最长有效括号
算法·leetcode·动态规划
CoderYanger2 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法