题目描述:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

不只要通过测试,要更着重代码的优化

测试用例:

base与exponent分别取正数、0、负数  共3*3九种情况

解题思路:

1)为base与exponent区分正数、0、负数  全面但是不够高效率的解法

class Solution {
public: bool g_InvalidInput = false;double Power(double base, int exponent) {if(base==0 && exponent<=0){  //相等这是否有问题??? 修改为 abs(base-0.0)<10e-10//0^0没有意义 而1/0 0不能为分母g_InvalidInput = true; //用于标记是由于出错,返回0(此时该值为true),若是由计算结果返回0,该值为false。            return 0.0;}double result = 1.0;//确定是正值,用无符号比较好unsigned int absExponent = (unsigned int)(exponent); //int到unsigned int要显示转换if(exponent<0)absExponent = (unsigned int)(-exponent); /*if(exponent<0)int absExponent = -exponent;  //for处会显示没有定义absExponent变量else int absExponent = exponent;*/        for (int i=0;i<absExponent;i++) //有更高效的求解方法result*=base;if(exponent<0)result=1.0/result; //用1.0比较好,而非1。 1也可以return result;}
};

注:[1]  对于double类型而言,由于精度的原因,不能用等号判断两个小数是否相等。因为double类型的表示往往是不精确的(近似表示),有精度范围的那种。如果是运算结果,即使都是0.0,也不保证相等!一般用一个容差e(很小的值)。

[2] 上述代码采用全局变量 g_InvalidInput 来标识是否出错(函数返回0时,是由于计算结果为零,还是错误的输入)。但是在使用函数返回值时,如 double result = Power(2,3); 调用时,常常容易忘记检查 g_InvalidInput 以判断是否出错

2)全面又高效的算法 时间复杂度O(logn)

当exponent=32时,要计算31次乘法。但是如果知道16的平方,再平方即可得到最终解。这样经过5次计算就可以得到最终解。

//实现1:递归调用class Solution {
public:bool g_InvalidInput = false;double Power(double base, int exponent) {if(abs(base-0.0)<10e-10 && exponent<=0){  //0^0没有意义 而1/0 0不能为分母g_InvalidInput = true; //用于标记是由于出错,返回0(此时该值为true),若是由计算结果返回0,该值为false。return 0.0;}double result = 1.0;//确定是正值,用无符号比较好unsigned int absExponent = (unsigned int)(exponent); //int到unsigned int要显示转换if(exponent<0)absExponent = (unsigned int)(-exponent);/*if(exponent<0)int absExponent = -exponent;  //for处会显示没有定义absExponent变量else int absExponent = exponent;*/for (int i=0;i<absExponent;i++)result*=base;if(exponent<0)result=1.0/result; //用1.0比较好,而非1。 1也可以return result;}//改进的代码double PowerWithUnsignedExponent(double base, unsigned int exponent){ if(exponent==0)  //奇数终止 1/2=0return 1;if(exponent==1)  //偶数终止 2/2=1return base;                //递归调用double result = PowerWithUnsignedExponent( base, exponent>>1); //右移代替除以2result*=result;if(exponent&0x1==1)  //位与操作,最后一位是1,则一定是奇数。最后一位是0,则一定是偶数。  exponent%2==1 也可以判断,但是效率很低result*=base;return result;}
};  

代码中的两处细节:判断base是否为0,以及用位运算代替乘除法以及取余运算。

位运算的效率比乘除法及求余运算的效率要高很多!!  

//实现2:循环实现
class Solution {
public:bool g_InvalidInput = false;double Power(double base, int exponent) {double result = 1,currBase = base;int absExponent;if(exponent>0){absExponent = exponent;}else if(exponent<0){if(base==0.0){g_InvalidInput = true;return 0.0;//throw new RuntimeException("分母不能为0"); }absExponent = -exponent;}else{// n==0return 1;// 任何数的0次幂(包括0的0次方)。}  //循环实现while(absExponent!=0){if((absExponent&1)==1) //奇数result*=currBase;currBase*=currBase;// 翻倍,记录的是基数absExponent>>=1;// 右移一位,除以2}return exponent>=0?result:(1/result);}
};  

指数计算:

  • 当n为偶数,a^n =(a^n/2)*(a^n/2)
  • 当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
  • 2^11 = 2^1 * 2^2 * 2^8     //其中11的二进制表示位 :1011 将其拆分为:100000100001
  • 2^1011 = 2^0001 * 2^0010  * 2^1000

转载于:https://www.cnblogs.com/GuoXinxin/p/10419228.html

16 数值的整数次方 (第3章 高质量的代码-代码的完整性)相关推荐

  1. 面试题16: 数值的整数次方

    /******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...

  2. 【LeetCode】剑指 Offer 16. 数值的整数次方

    [LeetCode]剑指 Offer 16. 数值的整数次方 文章目录 [LeetCode]剑指 Offer 16. 数值的整数次方 package offer;public class Soluti ...

  3. 剑指offer:面试题16. 数值的整数次方

    题目:数值的整数次方 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 1: 输 ...

  4. 【附可运行代码】剑指 Offer 16. 数值的整数次方

    立志用最少的代码做最高效的表达 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn).不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入:x = 2.00000, n = 10 ...

  5. 《剑指offer》c++版本 16.数值的整数次方

    如题: 题目要求一个数的N次方,且不需要考虑大数,看似简单,for循环搞定.仔细详细,问题还挺多.比如,base为0或者指数为负,同时浮点数和0比较也是个问题.很多时候,面试官出的题目看似简单,但如果 ...

  6. 剑指offer——16.数值的整数次方

    题目: 实现求base的exponent次方 知识点: 判断奇数还是偶数,a&1==1: 某数除以二,a >>= 1; a>0? res=1:res=2,当满足条件时,选前者 ...

  7. 剑指offer面试题16. 数值的整数次方(二分法)

    题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 思路 详见链接 代码 cl ...

  8. 剑指 Offer 16. 数值的整数次方

    思路:快速幂模板,主要要注意负数的范围,乘以负一的时候会溢出,所以开一下longlong class Solution { public:double myPow(double x, int n) { ...

  9. 【LeetCode笔记】剑指 Offer 16. 数值的整数次方(Java、分治)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 很棒的题目!便于分治思想的理解! 思路 && 代码 分情况是大头- 递归结束的情况: x0x^0x0 = 1 x1 ...

  10. 【leetcode】剑指 Offer 16. 数值的整数次方(shu-zhi-de-zheng-shu-ci-fang-lcof)(快速幂)[中等]

    链接 https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/ 耗时 解题:6 min 题解:6 min 题意 实现 po ...

最新文章

  1. 【Web安全】JSP内存马研究
  2. ssm实现发送邮件功能
  3. boost::multi_index模块相关的测试程序
  4. 【python】获取PC机公网IP并发送至邮箱
  5. 三星Nexus S刷回官方4.0.4教程
  6. 移动端安全测试主要涉及_Android APP安全测试基础
  7. php redis命令大全,redis命令大全参考手册
  8. 容器安全 - 以只读方式运行容器
  9. 【译】在设计表单的时候应该注意的八点
  10. C#编程(二十五)----------接口
  11. 两个表里数组字段的映射关联(stuff ,charindex,for xml path)
  12. python shelve模块_python shelve模块
  13. 从阿尔法狗元(AlphaGo Zero)的诞生看终极算法的可能性
  14. IP数据包和ICMP数据包的结构
  15. 计算机快捷键 f6,联想g510笔记本触摸板无法使用快捷键f6关闭?
  16. android去除gps漂移代码,GPS漂移过滤算法
  17. 专访智齿科技徐懿丨企服公司四要素:智能、融合、产品复杂度、客单价
  18. bzoj 2959: 长跑(LCT+并查集)
  19. Learning to Rank(以下简称L2R)
  20. IntelliJ Idea入门教程:如何新建项目

热门文章

  1. 第七章 (四)BFS(路径寻找问题)
  2. dns代表计算机哪个术语,windows dns 术语解释
  3. android 属性翻牌动画,如何在Android中利用TextSwitcher实现一个文字上下翻牌效果
  4. C语言日字,【C语言日日练(二)】static关键字
  5. 阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
  6. shell基础09 归档数据
  7. js复制隐藏域中的文字
  8. sql server book
  9. Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
  10. NSString 的常用方法