剑指offer--面试题11
题目:求数值的整数次方,不考虑大数值情况
即实现函数: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;
}
)AUA@CXRP.jpg)
)AUA@CXRP.jpg)
)AUA@CXRP.jpg)
)AUA@CXRP.jpg)
2、实现除2操作(/2)的更高效做法:int result = exponent >> 1; (exponent >> 1)
3、实现对2取余(%2)操作的更高效方法(实际上是判断数值为奇数偶数):int result; (result%2) <==> (result & 0x1)
代码中为result & 0x1 == 1,此时若成立则result为奇数。
剑指offer--面试题11的更多相关文章
- 剑指offer——面试题11:旋转数组的最小数字
#include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...
- 剑指Offer面试题11(Java版):数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数,同一时候不须要考虑大数问题 1.自以为非常easy的解法: ...
- 剑指Offer:面试题11——数值的整数次方(java实现)
题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...
- 数值的整数次方(剑指offer面试题11)
实现函数 double Power(double base, int exponent),即乘方运算. 考虑问题 exponet < 0 , 可以转化为 1.0 / Power(base, -1 ...
- 剑指offer——面试题11:快速排序
#include"iostream" #include"random" using namespace std; /* void Swap(int &a ...
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
随机推荐
- 你所不知道的html5与html中的那些事第三篇
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
- 检测是否支持HTML5中的Video标签
//检测是否支持HTML5 function checkVideo() { if (!!document.createElement('video').canPlayType) { var vidTe ...
- AMQ学习笔记 - 09. Spring-JmsTemplate之接收
概要 JmsTemplate提供了4组*3,共计12个接收用的方法. JmsTemplate接收所需要的资源ConnectionFactory和Destination,和发送是一致的. 接收的 ...
- 【转载】#303 - Accessibility of Class Members
Members of a class can have different kinds of accessibility. An accessibility keyword indicates wha ...
- 分支优化:neg+sbb算术运算代替逻辑跳转
今天在分析一个样本的时候,发现一段代码. // .text:100012DF sub esi, 0B7h // 183 // .text:100012E5 neg esi // .text:10001 ...
- NSTimer定时器类
NSTimer是Cocoa中比较常用的定时器类,基本操作如下: handleTimer方法可以自行定义.在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次. - (vo ...
- ArcGIS API for JavaScript介绍
ArcGIS API for JavaScript中的类是按照模块组织的,主要包含esri.esri/geometry.esri/renderers.esri/symbols.esri/symbols ...
- Discuz 3.X 门户文章插入图片自动添加 alt 标签
最近用 Discuz 搭建了个网站--儿童安全座椅网(www.bbseat.com.cn),用到了门户功能,不得不说Discuz 的功能还是非常强大的,但在使用过程中发现在发表文章时添加了图片却不能像 ...
- 防火墙设置:虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)
我在Windows7系统安装了虚拟机,通过虚拟机安装了Ubuntu13.04,我设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机. 我的操作是:关 ...
- 数据库操作类util
package util; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; imp ...