题目:求数值的整数次方,不考虑大数值情况

  即实现函数:double Power(double base, int exponent)

自己所写代码如下:

#include "stdafx.h"
#include <iostream> double Power(double base, int exponent); int main(int argc, char* argv[])
{
double base = -;
int exponent = ;
try
{
std::cout<<Power(base,exponent)<<std::endl;
}
catch(...)
{
std::cout<<"Invalid parameters!"<<std::endl;
}
return ;
} double Power(double base, int exponent)
{
if(base == )
{
if(exponent <= )
throw new std::exception("Invalid parameters!");
else
return ;
}
double base_exponent = ;
if(exponent == )
return ;
else if(exponent < )
{
while(exponent++)
base_exponent *= base; return 1.0/base_exponent;
}
else
{
while(exponent--)
base_exponent *= base; return base_exponent;
}
}

对try,catch应用还不熟练,只知道catch(...)会抓取所有可能异常。

看过作者的代码后,真心感觉自己的代码‘矬的一比’!

以下为作者代码:

#include "stdafx.h"
#include <math.h> bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent); double Power(double base, int exponent)
{
//g_InvalidInput = false; if(equal(base, 0.0) && exponent < )
{
g_InvalidInput = true;
return 0.0;
} unsigned int absExponent = (unsigned int)(exponent);
if(exponent < )
absExponent = (unsigned int)(-exponent); double result = PowerWithUnsignedExponent(base, absExponent);
if(exponent < )
result = 1.0 / result; return result;
} /*
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
double result = 1.0;
/
for(int i = 1; i <= exponent; ++i)
result *= base; return result;
}
*/
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if(exponent == )
return ;
if(exponent == )
return base; double result = PowerWithUnsignedExponent(base, exponent >> );
result *= result;
if((exponent & 0x1) == )
result *= base; return result;
} bool equal(double num1, double num2)
{
if((num1 - num2 > -0.0000001)
&& (num1 - num2 < 0.0000001))
return true;
else
return false;
}

通过该面试题,自己真正体会到在编程时,务必做到考虑问题的全面性!!!包括各种负面测试,输入测试以及本身涉及到的各种情况。

自己所写代码中,之前也丢掉了对0的负次幂的处理。。。

参考代码采用的是:设置全局变量的错误处理方式,出错时将设置g_InvalidInput 为true;自己所写代码则是使用C++中的异常处理方法:throw std::new exception("Invalid parameters!")

另外,学习该代码更重要的是学到了3个编程技巧

1、千万注意的:判断两个小数是否相等,不能直接使用==。例如double和float类型。

  所采用的方法:如参考代码中那样,设计一个函数equal。判断相等的原则是:小数v1和v2的差值的绝对值|v1-v2|在很小的范围内,比如0.0000001。

  转换为代码:v1-v2 > -0.0000001 && v1-v2 < 0.0000001。

bool equal(double num1, double num2)
{
if((num1 - num2 > -0.0000001)
&& (num1 - num2 < 0.0000001))
return true;
else
return false;
}

2、实现除2操作(/2)的更高效做法:int result = exponent >> 1;  (exponent >> 1)

3、实现对2取余(%2)操作的更高效方法(实际上是判断数值为奇数偶数):int result; (result%2)  <==>  (result & 0x1)

                                 代码中为result & 0x1 == 1,此时若成立则result为奇数。

剑指offer--面试题11的更多相关文章

  1. 剑指offer——面试题11:旋转数组的最小数字

    #include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...

  2. 剑指Offer面试题11(Java版):数值的整数次方

    题目:实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数,同一时候不须要考虑大数问题 1.自以为非常easy的解法: ...

  3. 剑指Offer:面试题11——数值的整数次方(java实现)

    题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...

  4. 数值的整数次方(剑指offer面试题11)

    实现函数 double Power(double base, int exponent),即乘方运算. 考虑问题 exponet < 0 , 可以转化为 1.0 / Power(base, -1 ...

  5. 剑指offer——面试题11:快速排序

    #include"iostream" #include"random" using namespace std; /* void Swap(int &a ...

  6. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  7. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  8. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  9. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

  10. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

随机推荐

  1. 实现百度外卖APP个人中心头像"浪"起来的动画效果

    让你的头像浪起来~~~~~ DEMO 地址:网页链接,点击下载 你需要知道的 CADisplayLink 简单的说就是一定时器,其根本利用刷帧和屏幕频率一样来重绘渲染页面. 其创建方式: [Objec ...

  2. UINavigationController基本使用

    写了很长的NavigationController介绍,结果被cnblog吞了,没存档,算了,简单粗暴,直接上如何使用. 1.创建3个Controller,继承自UIViewController 在A ...

  3. 通过js判断手机访问跳转到手机站

    第一种方法: <script> ){ //pc //window.location.href="电脑网址"; }else{ //shouji window.locati ...

  4. Myeclipse安装svn插件(link方式)

    Myeclipse安装svn插件(link方式) 优点:1.离线安装2.非侵入式 演示版本 myeclipse--myeclipse8.6 svn--subeclipse-site-1.6.5.zip ...

  5. win8.1环境下硬盘安装centos6.5双系统

    作为一名软件工程师或是相关行业的从业人员,经常会用到linux系统,这里为大家介绍的安装linux的方案是在原有win环境下安装linux双系统,两个系统选择分别为win8.1 和centos6.5. ...

  6. WinForm TreeView节点重绘,失去焦点的高亮显示

    当用户焦点离开TreeView时,TreeView选中节点仍然高亮,但是颜色符合主题. 设置TreeView.HideSelection = False;可让选中节点保持高亮. 添加重绘事件 Tree ...

  7. visual studio中创建单元测试

    1 打开  工具--自定义 2 选择 上下文菜单--编辑器上下文菜单|代码窗口 3 在这里我们可以看到“创建单元测试”这个菜单了,将它移到运行测试菜单下面 4 关闭VS并重启 重启后再对着类名,点击右 ...

  8. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. 解析php mysql 事务处理回滚操作(附实例)

    其实用PHP来处理mysql的事务回滚并不难,下面小编就详细的为大家介绍一下.相信大家看完之后都知道如何使用 很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果 ...

  10. PHP获取Cookie模拟登录CURL

    要提取google搜索的部分数据,发现google对于软件抓取它的数据屏蔽的厉害,以前伪造下 USER-AGENT 就可以抓数据,但是现在却不行了.利用抓包数据发现,Google 判断了 cookie ...