剑指offer----C语言版----第十一天

news/2025/3/25 15:17:49/

目录

1. 数值的整数次方

1.1 运行超时的思路

 1.2 思路一:  快速幂 (递归实现)

 1.3 思路二:  快速幂 (迭代实现)


1. 数值的整数次方

原题链接:

剑指 Offer 16. 数值的整数次方 - 力扣(LeetCode)https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/

我们都知道,  在C语言的一根库中有一个pow函数可以用来求一个数的乘方,  本题就是要求实现类似于pow的功能.  要求实现特定库函数(特别是处理数值和字符串的函数)的功能是一类常见的面试题。这就要求我们在平时编程的时候除了能熟练使用库函数,更重要的是要理解库函数的实现原理。

1.1 运行超时的思路

想必大家第一个想到的思路就是循环.  我们对输入的幂指数进行特殊处理:  使得幂指数大于0.  然后利用for循环将底数乘到最终结果上就可以了!  很遗憾Leetcode 并不想让你这么做,  面试官也不希望看到这种解法.

double myPow(double x, int n){//保存结果的变量double result = 1.0;//为啥用long int 后面讲long int a = n;//如果幂指数小于0, 取绝对值, 2的-1次方就等于二分之一的一次方嘛if(n < 0){a = -a;x = 1 / x;}//循环将底数乘到结果上int i = 0;for(i = 0;i < a;i++){result *= x;}return result;
}

 1.2 思路一:  快速幂 (递归实现)

快速幂的本质就是分治,  大家细细品味哈. 

       以上方法不可行,  我们可以换一种思路考虑:  例如,  我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样以此类推,我们求32次方只需要做5次乘法:  先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。对于奇数次方, 我们只需要拿出一个底数出来即可. 
      也就是说,我们可以用如下公式求a 的n次方:

 同上面一样我们需要对输入的幂指数进行处理:  

将幂指数保存在一个变量,  例如 a 中,  当幂指数小于 0 时,  我们就令 a = -a,  底数x = 1 / x,  就相当于对幂指数取绝对值,  然后把幂指数的负号作用到底数上,  2 的 -1 次方就等于 1/2 的 1 次方嘛.  

注意:  保存幂指数的变量必须选用存储范围更大的 long int,  我们都知道 int 的范围是 

 当我们输入的幂指数为 - (2的31次方时),  取绝对值后 int 类型是存不下这个数的. 

解题的时间复杂度:  O(logN),  因为是递归,  函数调用需要函数栈帧,  故空间复杂度:  O(logN).


double recurison(double x, long int n)
{//递归的结束条件, 任何数的0次幂都等于1(0除外)if(n==0){return 1;}// 将幂指数整除2, 但是我们选用位运算提高效率double result = recurison(x, n>>1);result *= result;//判断奇偶, 奇数就乘以一个底数, 同样使用位运算提高效率if((n&1)==1){result*=x;}return result;
}double myPow(double x, int n){double result;//对指数进行处理long int a = n;if(n < 0){a = -a;x = 1 / x;}return recurison(x, a);
}

 1.3 思路二:  快速幂 (迭代实现)

还是以具体的例子来看:  我们一开始还是对幂指数进行处理使它为整数哈,  当幂指数n为偶数,  例如x ^ 8  我们先算 x * x = x ^ 2,  再算x ^ 2 * x ^ 2 = x ^ 4,  最后算x ^ 4 * x ^ 4 = x ^ 8. 对于奇数呢,  我们将指数进行拆分,  例如 x ^ 10,  指数10 = 1 + 4 + 8  = 2 ^ 0 + 2 ^ 2 + 2 ^ 3,  即 

x ^ 10 = x ^ 1 * x ^ 4 * x ^ 8

 依次类推, 直到将幂指数的二进制遍历完毕,  显然result 乘上的值在每一遍历一个二进制位时都要逐步递增:  

 偶数自然不用说,  也是满足此规律的.


double myPow(double x, int n){//保存结果的变量double result = 1.0;//对指数进行处理long int a = n;if(n < 0){a = -a;x = 1 / x;}//遍历指数的二进制位, 对指数逐步右移即可while(a){//如果二进制位为1, 乘上当时的x的二进制位值的次幂if((a&1)==1){result *= x;}//下一个二进制位的, x的二进制位值的次幂x = x * x;//将a右移a >>= 1;}return result;
}

 由于作者表达能力有限,  思路可能不是很清晰,  望大佬们海涵.


http://www.ppmy.cn/news/10055.html

相关文章

40 行 Python 代码,写一个 CPU!

目录 一、引言 二、CPU 的组成 三、工作原理 四、CPU 指令工作详细剖析 五、 Python 实现 CPU 各组成部分 六、集成 CPU 七、为CPU编程&#xff0c;体会上古程序员 工作流程 八、总结 一、引言 CPU 如何工作&#xff1f;是困扰初级用户一个迷雾般的难题。我们可能知道诸…

【华为机试真题详解】查找单入口空闲区域【2022 Q4 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1示例 2示例 3示例 4题目解析参考代码前言 《华为机试真题详解 Python实现》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!…

做好功课!解析MES系统实施过程

“关于是否引进MES系统&#xff0c;我们的顾虑主要还是集中在对它的不了解上面。” 科技的进步&#xff0c;大数据的普及&#xff0c;使得各类信息系统频繁出现在我们生活中的角角落落。小到笔记本电脑的软硬件管理系统&#xff0c;大到国家层面的安全管理系统&#xff0c;都让…

百度语音+自动驾驶感知+深度学习平台技术解析

HIEV快讯&#xff08;文/戒僧&#xff09;本文将解析三部分技术内容&#xff0c;出自百度2023 Create大会-技术开放日&#xff1a; •百度如何用“手机全双工语音交互”改善使用导航应用的体验 •如何用“上帝视角”BEV技术提升汽车的自动驾驶能力 •如何用百度自研的深度学习平…

微信小程序测试(简单项目测试)

Flex布局简介 布局的传统解决方案&#xff0c;基于盒状模型&#xff0c;依赖 display属性 position属性 float属性 什么是flex布局&#xff1f; Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指…

一个精美的登录界面原来是这样做的

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 玩归玩闹归闹&#xff0c;别拿java开玩笑 —————————————————— ⭐相关文章⭐ -通过窗口看…

Linux——Linux驱动之iMX6ULL平台下多点触摸屏驱动开发实战(MT协议、多点触摸API、基于框架的触摸驱动编写、触摸芯片驱动)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》

【软件项目管理 PMP】-- 100+真题考试题

1、一位项目经理正在管理一个项目,该项目非常复杂,执行期很长。虽然该项目大部分是预测性的,但团队能够使用一个混合框架将设计和执行分解成更小的包。企业希望跟踪这个框架应用所带来的价值,但没有为这个框架定义一套可衡量的项目。项目经理应该先做什么? A 、使用与上一…