剑指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; ...
随机推荐
- AMQ学习笔记 - 10. Spring-JmsTemplate之浏览
概述 浏览只是针对Queue的概念,Topic没有浏览.浏览是指获取消息而消息依然保持在broker中,而消息的接收会把消息从broker中移除. 浏览可以用来实现对Queue中消息的监控. JMS ...
- 已有数据表的Mysql字符编码修改
Mysql字符集修改应该如何实现呢?下面就为您详细介绍已用数据表的Mysql字符集修改方法,希望对您学习Mysql字符集方面能有所启迪. 环境:在应用开始阶段没有正确的设置字符集,在运行一段时间以后才 ...
- 【风马一族_windom】 批量修改相同文件类型的后缀
难题:有时因为某种原因,修改一堆文件的类型,重复操作次数多,浪费时间也跟着多,收获也会相当少. 提问:对于软件而言,可量化的,有规律的操作,可以使用程序来进行替代. 特性:在微软操作系统上,不同后缀的 ...
- 《samba服务配置的文本》
创建简单的samba服务器 samba 很少用于互联网 /大部分用于局域网 网页更新/ 首先看下你是否安装后了samba. rpm -qa | grep samba samba的简介 1)samb ...
- WP开发笔记——页面传参
WP APP页面与页面之间参数的传递可以通过程序的App类设置全局变量. 由于App 类继承自Application类,而通过Application的Current属性可以获取到与当前程序关联的App ...
- [大牛翻译系列]Hadoop(18)MapReduce 文件处理:基于压缩的高效存储(一)
5.2 基于压缩的高效存储 (仅包括技术25,和技术26) 数据压缩可以减小数据的大小,节约空间,提高数据传输的效率.在处理文件中,压缩很重要.在处理Hadoop的文件时,更是如此.为了让Hadoop ...
- ECSHOP的订单状态在数据库中的表现(order_status, shipping_status, pay_status)
echop的订单状态都是在ecs_order_info表中的字段里. 订单状态 未确认 取消 确认 已付款 配货中 已发货 已收货 退货 order_status 0 2 1 1 1 5 5 4 sh ...
- 使用Azure portal Create Virtual Machine
使用简单快速的方式穿件的Virtual Machine 这个步骤隐藏的了很多步骤,例如的创建的云服务(Cloud Service) 创建存储(Storage) 存储名为系统自动产生 可以通过存储看到含 ...
- cadence 16.6 Pspice 仿真步骤
从ADI官网下载后缀为 cir 的文件,AD8210 为例 进行仿真 1 打开 Cadence -> Release 16.6 -> PSpice Accessories -> Mo ...
- django 更新model
修改models.py 中对应的class 在admin.py 中 增加 admin.site.register(WafDevice) 进入dbshell python manage.py dbshe ...