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;

    }
}

测试结果

相关推荐
上海合宙LuatOS几秒前
LuatOS ——Modbus RTU 通信模式
java·linux·服务器·开发语言·网络·嵌入式硬件·物联网
野生技术架构师8 分钟前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
Anastasiozzzz13 分钟前
对抗大文件上传---分片加多重Hash判重
服务器·后端·算法·哈希算法
Vivienne_ChenW16 分钟前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
Coder_Boy_17 分钟前
基于SpringAI的在线考试系统-整体架构优化设计方案(续)
java·数据库·人工智能·spring boot·架构·领域驱动
勤奋的小王同学~17 分钟前
SpringMVC
java·spring·mvc
笨蛋不要掉眼泪18 分钟前
RAG知识库核心API架构全解析:从文档加载到向量检索的完整流程
java·spring boot·redis·ai·架构
不染尘.23 分钟前
二叉树相关题目
开发语言·数据结构·c++·算法
静谧空间33 分钟前
java登录验证码CaptchaConfig
java·开发语言
Imxyk37 分钟前
力扣:632. 最小区间(贪心)
java·数据结构·算法