当前位置: 首页 > news >正文

剑指offer15_数值的整数次方

数值的整数次方


实现函数 double Power(double base, int exponent)

题目要求

计算 base exponent \text{base}^{\text{exponent}} baseexponent

  • 不得使用库函数
  • 不需要考虑大数问题,绝对误差不超过 10 − 2 10^{-2} 102
  • 不会出现底数和指数同为 0 的情况
  • 当底数为 0 时,指数一定为正
  • 底数绝对值不超过 10,指数范围 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311]
样例1
输入:10 ,2输出:100
样例2
输入:10 ,-2  输出:0.01

算法思路
  1. 处理指数为 0 的情况:直接返回 1.0。
  2. 处理负指数
    • 将负指数转换为正数处理
    • 使用 long long 存储指数,避免 INT_MIN 取绝对值时溢出
    • 最终结果取倒数
  3. 快速幂算法
    • 初始化结果 res = 1.0
    • 循环处理指数(二进制分解):
      • 若当前二进制位为 1,则乘上当前底数
      • 底数平方,指数右移一位
    • 若底数变为 0,提前终止循环(避免后续无效计算)
  4. 处理负指数结果:返回 1.0/res
时间复杂度
  • O(log⁡n):每次迭代将指数减半
关键点
  • 负指数处理:转换为正数计算后取倒数
  • 大指数处理:使用 long long 避免溢出
  • 浮点精度:当底数平方下溢为 0 时提前终止
  • 边界情况:底数为 0 时直接返回 0(指数为正)
C++ 实现
class Solution {
public:double Power(double x, int n) {typedef long long ll;double res = 1;bool im = n < 0;for(ll k = abs(ll(n)); k; k >>= 1){if(k & 1) res *= x;x *= x;}if(im) res = 1 / res;return res;}
};

相关文章:

  • JavaScript性能优化实战:从核心原理到工程实践的全流程解析
  • java反序列化:CC5利用链解析
  • 【Python进阶】装饰器
  • SpringBoot接入Kimi实践记录轻松上手
  • 九(5).引用和指针的区别
  • 基于大模型的短暂性脑缺血发作(TIA)全流程预测与诊疗辅助系统详细技术方案
  • UVa12298 Super Joker II
  • 手摸手还原vue3中reactive的get陷阱以及receiver的作用
  • 使用 C++/OpenCV 制作跳动的爱心动画
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题
  • OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
  • 软考 系统架构设计师系列知识点之杂项集萃(78)
  • 15个基于场景的 DevOps 面试问题及答案
  • Ansys Zemax | 手机镜头设计 - 第 4 部分:用 LS-DYNA 进行冲击性能分析
  • 十.显式类型转换
  • 太阳敏感器:卫星姿态控制的“指南针
  • 报表/报告组件(二)-实例与实现解释
  • java-spring
  • Linux下使用nmcli连接网络
  • Python 数据分析与可视化实战:从数据清洗到图表呈现