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;

    }
}

测试结果

相关推荐
小鱼在乎1 分钟前
动态规划---最长回文子序列
算法·动态规划
xiaobai12 36 分钟前
二叉树的遍历【C++】
开发语言·c++·算法
Freak嵌入式13 分钟前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
java·开发语言·数据结构·python·接口·抽象基类
前端小马23 分钟前
解决IDEA出现:java: 程序包javax.servlet不存在的问题
java·servlet·intellij-idea
吱吱鼠叔31 分钟前
MATLAB数学规划:2.线性规划
算法·机器学习·matlab
声学黑洞仿真工作室38 分钟前
Matlab Delany-Bazley和Miki模型预测多孔材料吸声性能
开发语言·人工智能·算法·matlab·微信公众平台
机器学习之心42 分钟前
选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)
算法·选址模型
IH_LZH1 小时前
Broadcast:Android中实现组件及进程间通信
android·java·android studio·broadcast
去看全世界的云1 小时前
【Android】Handler用法及原理解析
android·java
.Net Core 爱好者1 小时前
Redis实践之缓存:设置缓存过期策略
java·redis·缓存·c#·.net