您的位置:首页 > 职场人生

剑指offer--面试题11

2013-08-10 22:01 239 查看
题目:求数值的整数次方,不考虑大数值情况

  即实现函数: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 = -1;
int exponent = 0;
try
{
std::cout<<Power(base,exponent)<<std::endl;
}
catch(...)
{
std::cout<<"Invalid parameters!"<<std::endl;
}
return 0;
}

double Power(double base, int exponent)
{
if(base == 0)
{
if(exponent <= 0)
throw new std::exception("Invalid parameters!");
else
return 0;
}
double base_exponent = 1;
if(exponent == 0)
return 1;
else if(exponent < 0)
{
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 < 0)
{
g_InvalidInput = true;
return 0.0;
}

unsigned int absExponent = (unsigned int)(exponent);
if(exponent < 0)
absExponent = (unsigned int)(-exponent);

double result = PowerWithUnsignedExponent(base, absExponent);
if(exponent < 0)
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 == 0)
return 1;
if(exponent == 1)
return base;

double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if((exponent & 0x1) == 1)
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为奇数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: