1. // 面试题:数值的整数次方
  2. // 题目:实现函数double Power(double base, int exponent),求base的exponent
  3. // 次方。不得使用库函数,同时不需要考虑大数问题。
  4.  
  5. #include <iostream>
  6. #include <cmath>
  7. using namespace std;
  8.  
  9. bool g_InvalidInput = false;//使用全局变量作为错误处理方式
  10. bool equal(double num1, double num2);
  11. double PowerWithUnsignedExponent(double base, unsigned int exponent);
  12.  
  13. double Power(double base, int exponent)
  14. {
  15. g_InvalidInput = false;
  16.  
  17. if (equal(base, 0.0) && exponent < )//这个函数返回0同时改变g_InvalidInput,后面判断为啥为0时候,这个变量会告诉我们是base=0且指数为负的错误
  18. {
  19. g_InvalidInput = true;
  20. return 0.0;//第一种情况:base=0
  21. }
  22.  
  23. unsigned int absExponent = (unsigned int)(exponent);
  24. if (exponent < )
  25. absExponent = (unsigned int)(-exponent);//如果不再加负号,absExponent会变成exponent的补数
  26.  
  27. double result = PowerWithUnsignedExponent(base, absExponent);
  28. if (exponent < )
  29. result = 1.0 / result;//第二种情况:absExponent<0
  30. //第三种情况:absExponent>=0
  31. return result;
  32. }
  33.  
  34. //下面这个效率太低了
  35. /*
  36. double PowerWithUnsignedExponent(double base, unsigned int exponent)
  37. {
  38. double result = 1.0;
  39.  
  40. for (int i = 1; i <= exponent; ++i)
  41. result *= base;
  42.  
  43. return result;
  44. }
  45. */
  46.  
  47. //类似之前的斐波那契函数里一个计算方式
  48. double PowerWithUnsignedExponent(double base, unsigned int exponent)//计算base不为0,exponent为非负数情况下的幂值
  49. {
  50. if (exponent == )
  51. return ;
  52. if (exponent == )
  53. return base;
  54.  
  55. double result = PowerWithUnsignedExponent(base, exponent >> );//使用右移作为除2操作,会很快,exponent为正,所以不怕右移
  56. result *= result;
  57. if ((exponent & 0x1) == )//使用与操作判断是否是奇数,也是一种加速优化操作
  58. result *= base;
  59.  
  60. return result;
  61. }
  62.  
  63. bool equal(double num1, double num2)//由于精度原因,不能用==,必须让二者差在一个很小范围内就算相等
  64. {
  65. if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
  66. return true;
  67. else
  68. return false;
  69. }
  70.  
  71. // ====================测试代码====================
  72. void Test(const char* testName, double base, int exponent, double expectedResult, bool expectedFlag)
  73. {
  74. double result = Power(base, exponent);
  75. if (equal(result, expectedResult) && g_InvalidInput == expectedFlag)
  76. std::cout << testName << " passed" << std::endl;
  77. else
  78. std::cout << testName << " FAILED" << std::endl;
  79. }
  80.  
  81. int main(int argc, char* argv[])
  82. {
  83. // 底数、指数都为正数
  84. Test("Test1", , , , false);
  85.  
  86. // 底数为负数、指数为正数
  87. Test("Test2", -, , -, false);
  88.  
  89. // 指数为负数
  90. Test("Test3", , -, 0.125, false);
  91.  
  92. // 指数为0
  93. Test("Test4", , , , false);
  94.  
  95. // 底数、指数都为0
  96. Test("Test5", , , , false);
  97.  
  98. // 底数为0、指数为正数
  99. Test("Test6", , , , false);
  100.  
  101. // 底数为0、指数为负数
  102. Test("Test7", , -, , true);
  103. system("pause");
  104. return ;
  105. }

《剑指offer》第十六题(数值的整数次方)的更多相关文章

  1. 【校招面试 之 剑指offer】第16题 数值的整数次方

    方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况. #include<iostream> using namespace std; template<typ ...

  2. 剑指Offer面试题:10.数值的整数次方

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

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

    // 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...

  4. 【剑指offer】面试题 16. 数值的整数次方

    面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ...

  5. 《剑指offer》面试题16. 数值的整数次方

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

  6. 剑指offer 12.代码的完整性 数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   本人渣渣代码: public double Power(double ba ...

  7. 剑指Offer(书):数值的整数次方

    题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 分析: * 要注意以下几点:* 1.幂为负数时,base不能为0,不然求的时候是对 ...

  8. 《剑指offer》面试题11 数值的整数次方 Java版

    书中方法:这道题要注意底数为0的情况.double类型的相等判断.乘方的递归算法. public double power(double base, int exponent){ //指数为0 if( ...

  9. 《剑指offer》第六题(重要!从尾到头打印链表)

    文件main.cpp // 从尾到头打印链表 // 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. #include <iostream> #include <sta ...

  10. 剑指offer五十六之删除链表中重复的结点

    一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

随机推荐

  1. 面经:Bloomberg Internship第一轮

    上来先问了一个系统设计的问题,一个front end, 一个back end. front end有很多UI,一个UI对10个多customers,back end有许多processor,或者pro ...

  2. liferay中数据库表的解析未完

    页面布局 1:表layout 主要的字段有: 字段 privateLayout 0表示的是公开的页面 字段 layoutId 如果在同一个社区中有很多的界面,layoutId表示各个界面,按照顺序排列 ...

  3. windows 7 中使用命令行创建WiFi热点

    就是让你的电脑可以作为WiFi热点,然后供其它支持WiFi的设备上网 首先你的电脑中必须有正常使用的无线网卡 幺幺幺切克闹,开始命令吧,(注:命令是在windows中的命令提示符中运行的) 禁用承载网 ...

  4. Hive 数据类型转换

    在Hive的日常使用中经常会遇到需要对字段进行数据类型转换的情况.Hive中的数据类型转换包括隐式转换(implicit conversions)和显式转换(explicitly conversion ...

  5. Linux基础命令---gzip

    gzip gzip通过Lempel-ziv算法来压缩文件,压缩的时候保留每个文件的所有者.权限.修改时间.对于符号链接,gzip将会忽略它. 如果压缩的文件名对其文件系统来说太长,则gzip将截断它. ...

  6. 左连接LEFT JOIN 连接自己时的查询结果测试

    #左连接LEFT JOIN 连接自己时的查询结果测试 #左连接LEFT JOIN 连接自己时的查询结果(都会出现两个重复字段),两个表都有as后只能查询相等条件merchant_shop_id非nul ...

  7. 浅谈CORS

    浅谈CORS CORS全称"跨站资源共享"(Cross-Origin Resource Sharing),它允许浏览器克服浏览器同源策略向跨域服务器发出请求. 同源策略 概念 说到 ...

  8. MySQL数据库----基础操作

    一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list ...

  9. MySQL Crash Course #17# Chapter 25. 触发器(Trigger)

    推荐看这篇mysql 利用触发器(Trigger)让代码更简单 以及 23.3.1 Trigger Syntax and Examples 感觉有点像 Spring 里的 AOP 我们为什么需要触发器 ...

  10. ELK+Kafka学习笔记之FileBeat日志合并配置输出到kafka集群

    filebeat.prospectors: - type: log               #日志输出类型   enabled: true                             ...