50. Pow(x, n)(递归,穷举)
Pow(x,n)C实现
- 1. 题目描述
- 2. 解题分析
- 3. C语言实现
- 3.1 递归法求解
- 3.2 简洁实现
1. 题目描述
难度:中等
2. 解题分析
- 暴力求解法
既然难度是中等,那么直接暴力求解应该是不行的。我试验了一下,利用n个循环的x叠加相乘的暴力求解法的结果是运算超时,因为x是浮点型变量,而n最大可以为2147483647,所以暴力求解是很耗时的,时间复杂度为n。 - 递归法
暴力不行,就用递归的方法,将n个x相乘逐步缩小为两个x相乘,然后进行递归求解,时间复杂度为log(n)。 - 需要注意的两个问题
- n为有符号整数,要考虑n为复数的情况
- 当n为负数时,最小为-2147483648. 这种情况下,我们不能简单的使用 n = -n 来进行取反,应为正数的2147483648是超过int型的范围的,这一点要注意。
3. C语言实现
3.1 递归法求解
源代码如下:
// 递归函数
double miniPow(double x, int n){// 初始化结果变量resdouble res = 1.0;// flag为正负号的标志位判断int i,flag=0;if(n < 0){// n小于0,flag=-1,n取反flag = -1;n = -n;}// n == 0时,直接返回结果1if(n == 0){return 1.0;}// n==1时,直接返回x本身else if(n == 1){return x;}n == 2时,返回x*xelse if(n == 2){return x*x;}else{// 开始递归,当n为偶数时,可以拆成两个n/2个x相乘if(n%2 == 0){res = miniPow(x, n/2);// res为一半的相乘结果,最终结果要输出res*resreturn res*res;}// 当n为奇数时,可以拆成两个(n-1)/2个x相乘,最后在乘以xelse{res = miniPow(x, (n-1)/2);return res*res*x;}}
}
// 主运算函数
double myPow(double x, int n){// 设立正负号标志位int flag_sign = 1;// 设立范围标志位int flag_range = 1;if(n < 0){// 当n<0并且n刚好等于-2147483648,让n=2147483647,并将范围标志位置-1if(n==-2147483648){n = -(n+1);flag_range = -1;}// 否则,n=-n,正负号标志位置-1else{n =-n;flag_sign = -1;}}// 当flag_range ==-1时,输出1.0/(miniPow(x, n)*x,否则根据n的正负数据相应结果if(flag_range < 0)return (1.0/(miniPow(x, n)*x));elsereturn flag_sign<0?(1.0/miniPow(x, n)):miniPow(x, n);
}
运行结果为:
3.2 简洁实现
使用折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。我们让i初始化为n,然后看i是否是2的倍数,是的话x乘以自己,否则res乘以x,i每次循环缩小一半,直到为0停止循环。最后看n的正负,如果为负,返回其倒数。
源码如下:
class Solution {public:double myPow(double x, int n) {double res = 1.0;for(int i = n; i != 0; i /= 2){if(i % 2 != 0){res *= x;}x *= x;}return n < 0 ? 1 / res : res;}
};
运行结果为:
50. Pow(x, n)(递归,穷举)相关推荐
- java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值
null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...
- 6.17.用100元人民币兑换10元,5元和一元的纸币共50张,请用穷举法编程计算共有几种兑换方法,每种方法各兑换多少张纸币。
#include<stdio.h> main() { int x,y,z; for(x=1;x<=9;x++) { for(y=1;y<=17;y++) { 10*x+5*y+ ...
- 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...
- Javascript迭代、递推、穷举、递归常用算法实例讲解
来源 | https://www.jb51.net/article/155800.htm 累加和累积 累加:将一系列的数据加到一个变量里面.最后的得到累加的结果 比如:将1到100的数求累加和 小球从 ...
- Javascript迭代、迭代、穷举、递归常用算法
累加和累积 累加:将一系列的数据加到一个变量里面.最后的得到累加的结果 比如:将1到100的数求累加和 小球从高处落下,每次返回到原来一半,求第十次小球落地时小球走过的路程 <script> ...
- java递归实现汉字组词穷举_01背包各种算法代码实现总结(穷举,贪心,动态,递归,回溯,分支限界)...
2020-05-22 所有背包问题实现的例子都是下面这张图 01背包实现之--穷举法: 1.我的难点: (1)在用穷举法实现代码的时候,我自己做的时候认为最难的就是怎么将那么多种情况表示出来,一开开始 ...
- matlab穷举全排列,全排列:穷举法和递归法
#include #include //2013-4-21 //n个数全排列 //使用穷举法实现 假设 n=3 的情况,根据n使用不同层的for循环 void Brute_Force_Full_Arr ...
- 求最大公约数的4种方法C语言(辗转相除法、辗转相减法、穷举法、递归法)
最大公约数,也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个. 目录 问题描述 辗转相除法(欧几里得算法) 代码实现 辗转相减法 代码实现 暴力穷举法 代码实现 递归法 代码实现 测试 ...
- 累加、迭代、递推、穷举、递归 ,等运算,笔记
8.计算 8.1累加: 累加:将一系列的数据加到一个变量里面,最后得到了累加的结果. 一般形式: 累加:V+=e: 累积:V*=e: V代表累加和累积,e代表累加累积项. 算法要点: 1. 初始 ...
最新文章
- 多分类 数据不平衡的处理 lightgbm
- 营销大数据分析 关键技术_营销分析的3个最关键技能
- 使用Apache Camel进行负载平衡
- 它们是什么以及为什么我们不需要它们
- 四川省中职计算机考试题,(四川省计算机等级考试题库.doc
- 【微软官方文档】Windows终端(Windows Terminal)
- javascript 的参数有长度限制吗?一个细节引起的误区
- New UWP Community Toolkit - ImageEx
- ipython版本_1. Python版本的选择与安装
- loj10036. 「一本通 2.1 练习 2」Seek the Name, Seek the Fame
- Opencv_缺少CV_CAP_PROP_FRAME_WIDTH
- vmware workstation虚拟环境安装及创建虚拟机
- multisim仪表运放_Multisim仿真---三运放仪表放大器
- 仅需6步!虹科教你如何在第三方软件CODESYS中配置PCAN
- credit author statement
- 三自由度机器人轨迹规划(两旋转+移动)
- magento 货币换算
- 浏览器输入www.baidu.com之后发生了什么
- 6款提升办公效率的超牛软件,从此告别加班
- 2021年塔式起重机司机新版试题及塔式起重机司机试题及解析
热门文章
- VDO-SLAM论文阅读
- 软考网络管理员学习笔记2之第二章数据通信基础
- java baas_调试后台Baas(Java):调试用户自己的java代码
- php从注册列表卸载,MSSQL_彻底删除SQL Server注册表的方法,一般在卸载完数据库时,大家 - phpStudy...
- java文件不能转class_安了jdk 却不能将.java文件转换成.class 文件,一运行就说‘javac’不是内部或外部指令,却能运行.class文...
- SpringBoot-Mail 发邮件(单发、群发、加附件、HTML格式)
- JS中的location.href
- nginx-正则表达式-重定向
- How to setup linked servers for SQL Server and Oracle 64 bit client
- SqlServer-函数