力扣第 50 题Pow(x, n)

devtools/2024/11/15 2:42:29/

力扣第 50 题是 Pow(x, n),要求实现一个计算 xn 次幂的函数,即实现函数 double myPow(double x, int n)。这个问题考察的是如何在高效的情况下计算大次幂,尤其是如何处理 n 为负数的情况。

解题思路

  1. 如果 n 是负数,将问题转化为求 1 / myPow(x, -n),并且注意处理 n 为最小值的情况。
  2. 使用递归实现快速幂运算,如果 n 为偶数,则计算 myPow(x, n / 2) * myPow(x, n / 2);如果 n 为奇数,则计算 x * myPow(x, n / 2) * myPow(x, n / 2)
  3. 优化的迭代解法通过位运算实现快速幂,避免了递归的函数开销。

代码实现

以下是 C 语言的递归与迭代两种实现方式。

方法 1:递归实现快速幂
#include <stdio.h>// 递归实现快速幂算法
double myPow(double x, int n) {if (n == 0) return 1.0;  // 任何数的 0 次幂为 1if (n < 0) {// 处理负指数if (n == -2147483648) {  // 避免 n == -n 这种情况return 1.0 / (myPow(x, 2147483647) * x);}return 1.0 / myPow(x, -n);}// 快速幂递归double half = myPow(x, n / 2);if (n % 2 == 0) {return half * half;} else {return half * half * x;}
}int main() {double x = 2.0;int n = 10;printf("%f\n", myPow(x, n));  // 输出 1024.000000x = 2.1;n = 3;printf("%f\n", myPow(x, n));  // 输出 9.261000x = 2.0;n = -2;printf("%f\n", myPow(x, n));  // 输出 0.250000return 0;
}
方法 2:迭代实现快速幂(推荐)

迭代方法避免了递归调用的栈开销,采用位运算判断 n 的奇偶性并逐步累积结果:

#include <stdio.h>double myPow(double x, int n) {long long N = n;  // 使用 long long 避免溢出if (N < 0) {x = 1 / x;N = -N;}double result = 1.0;while (N > 0) {if (N % 2 == 1) {result *= x;  // 如果 N 是奇数,额外乘一次 x}x *= x;           // 平方底数N /= 2;           // 将 N 减半}return result;
}int main() {double x = 2.0;int n = 10;printf("%f\n", myPow(x, n));  // 输出 1024.000000x = 2.1;n = 3;printf("%f\n", myPow(x, n));  // 输出 9.261000x = 2.0;n = -2;printf("%f\n", myPow(x, n));  // 输出 0.250000return 0;
}

逐步解释

  1. 负指数处理:将负指数转化为正指数,并取倒数处理。如果 n 为负,将 x 替换为 1/x 并将 N 转为正数。
  2. 迭代循环
    • 通过循环对 N 进行二进制处理:如果 N 是奇数,将结果乘以当前的 x 值;如果 N 是偶数,直接进行 x 的平方处理,并让 N 右移。
  3. 返回结果:最终返回累积结果 result

http://www.ppmy.cn/devtools/134063.html

相关文章

Unity3D实现视频和模型融合效果

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示如下👉二、VideoPlayer播放视频(一)👉2-1、Hieraechy面板右键创建videoPlayer👉2-2、Assets面板右键创建RenderTexture👉2-3、把设置好的RenderTexture拖到videoPlayer里面还有本地视频视频�…

【C++】vector模拟实现、迭代器失效问题(超详解)

vector会使用之后我们来模拟实现一下&#xff0c;通过对vector的模拟实现&#xff0c;我们来说一下迭代器失效问题。 1.准备工作 在头文件vector.h里声明和实现函数&#xff0c;然后在test.cpp里测试代码的正确性。 在vector.h中用命名空间分隔一下&#xff0c;因为c库里面也有…

重学 Android 自定义 View 系列(六):环形进度条

目标 自定义一个环形进度条&#xff0c;可以自定义其最大值、当前进度、背景色、进度色&#xff0c;宽度等信息。 最终效果如下&#xff08;GIF展示纯色有点问题&#xff09;&#xff1a; 1. 结构分析 背景圆环&#xff1a;表示进度条的背景。进度圆环&#xff1a;表示当前…

鸿蒙next版开发:音频并发策略扩展(ArkTS)

在HarmonyOS 5.0中&#xff0c;音频并发策略是管理多个音频流同时播放时的交互和优先级的关键。ArkTS提供了音频会话管理&#xff08;AudioSessionManager&#xff09;接口&#xff0c;允许应用自定义音频流的焦点策略&#xff0c;以适应特定的使用需求。本文将详细介绍如何在A…

C++——视频问题总结

1、C和C的区别 CC面向过程对象注重程序的实现逻辑程序的整体设计内容C语言采用了一种有序的编程方法——结构化编程&#xff1a;将一个大型程序分解为一个个小型的&#xff0c;易于编写的模块&#xff0c;所有模块有序调动&#xff0c;形成了一个程序的完整的运行链C将问题分解…

微信小程序——实现二维码扫描功能(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

架构师考试 五大架构风格

架构师考试通常会涵盖软件架构设计的多个关键方面&#xff0c;其中五大架构风格是重要的考试内容。这五大架构风格分别是数据流风格、调用/返回风格、独立构件风格、虚拟机风格和仓库风格。以下是对这五大架构风格的详细解释&#xff1a; 一、数据流风格 子风格&#xff1a; …