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)(递归,穷举)相关推荐

  1. java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值

    null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...

  2. 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+ ...

  3. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  4. Javascript迭代、递推、穷举、递归常用算法实例讲解

    来源 | https://www.jb51.net/article/155800.htm 累加和累积 累加:将一系列的数据加到一个变量里面.最后的得到累加的结果 比如:将1到100的数求累加和 小球从 ...

  5. Javascript迭代、迭代、穷举、递归常用算法

    累加和累积 累加:将一系列的数据加到一个变量里面.最后的得到累加的结果 比如:将1到100的数求累加和 小球从高处落下,每次返回到原来一半,求第十次小球落地时小球走过的路程 <script> ...

  6. java递归实现汉字组词穷举_01背包各种算法代码实现总结(穷举,贪心,动态,递归,回溯,分支限界)...

    2020-05-22 所有背包问题实现的例子都是下面这张图 01背包实现之--穷举法: 1.我的难点: (1)在用穷举法实现代码的时候,我自己做的时候认为最难的就是怎么将那么多种情况表示出来,一开开始 ...

  7. matlab穷举全排列,全排列:穷举法和递归法

    #include #include //2013-4-21 //n个数全排列 //使用穷举法实现 假设 n=3 的情况,根据n使用不同层的for循环 void Brute_Force_Full_Arr ...

  8. 求最大公约数的4种方法C语言(辗转相除法、辗转相减法、穷举法、递归法)

    最大公约数,也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个. 目录 问题描述 辗转相除法(欧几里得算法) 代码实现 辗转相减法 代码实现 暴力穷举法 代码实现 递归法 代码实现 测试 ...

  9. 累加、迭代、递推、穷举、递归 ,等运算,笔记

    8.计算 8.1累加: 累加:将一系列的数据加到一个变量里面,最后得到了累加的结果. 一般形式: 累加:V+=e: 累积:V*=e: V代表累加和累积,e代表累加累积项. 算法要点: 1.    初始 ...

最新文章

  1. 多分类 数据不平衡的处理 lightgbm
  2. 营销大数据分析 关键技术_营销分析的3个最关键技能
  3. 使用Apache Camel进行负载平衡
  4. 它们是什么以及为什么我们不需要它们
  5. 四川省中职计算机考试题,(四川省计算机等级考试题库.doc
  6. 【微软官方文档】Windows终端(Windows Terminal)
  7. javascript 的参数有长度限制吗?一个细节引起的误区
  8. New UWP Community Toolkit - ImageEx
  9. ipython版本_1. Python版本的选择与安装
  10. loj10036. 「一本通 2.1 练习 2」Seek the Name, Seek the Fame
  11. Opencv_缺少CV_CAP_PROP_FRAME_WIDTH
  12. vmware workstation虚拟环境安装及创建虚拟机
  13. multisim仪表运放_Multisim仿真---三运放仪表放大器
  14. 仅需6步!虹科教你如何在第三方软件CODESYS中配置PCAN
  15. credit author statement
  16. 三自由度机器人轨迹规划(两旋转+移动)
  17. magento 货币换算
  18. 浏览器输入www.baidu.com之后发生了什么
  19. 6款提升办公效率的超牛软件,从此告别加班
  20. 2021年塔式起重机司机新版试题及塔式起重机司机试题及解析

热门文章

  1. VDO-SLAM论文阅读
  2. 软考网络管理员学习笔记2之第二章数据通信基础
  3. java baas_调试后台Baas(Java):调试用户自己的java代码
  4. php从注册列表卸载,MSSQL_彻底删除SQL Server注册表的方法,一般在卸载完数据库时,大家 - phpStudy...
  5. java文件不能转class_安了jdk 却不能将.java文件转换成.class 文件,一运行就说‘javac’不是内部或外部指令,却能运行.class文...
  6. SpringBoot-Mail 发邮件(单发、群发、加附件、HTML格式)
  7. JS中的location.href
  8. nginx-正则表达式-重定向
  9. How to setup linked servers for SQL Server and Oracle 64 bit client
  10. SqlServer-函数