面试题------数值整数次方

来源:互联网 发布:海地软件 编辑:程序博客网 时间:2024/06/05 15:23

问题要求

实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要靠考虑大数问题。

问题分析

看到这个问题,我觉得我跟大多数人想的是一样,直接循环作乘法。但是仔细一想,考虑的还是太少了。从底数和指数两方面分别考虑:


有这么几种情况我们不容忽视,1)对0求倒数出现异常,要做特殊处理;2)0的0次方是没有任何意义的,需要做特殊处理;3)复次幂即将指数求绝对值,然后再将最后的结果取倒数即可。

仔细阅读题目就会发现,题目要求底数类型是double型的,那么在判断底数是不是等于0时,不能直接判断base == 0.(计算机在表示小数时都有误差)。判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围中。所以将该判断方法封装成一个函数即可  bool equal(double x,double y);

代码如下:

//全局变量用来标识出错是因为底数为0且指数为负数的情况bool InvaildeInput = false;//判断两个小数是否相等bool equal(double x,double y){if ((x - y > -0.0000001) && (x - y < 0.0000001))return true;elsereturn false;}//计算指数为正整数时的整数次方double PowerUnsignedExponent(double base,unsigned int exponent){double result = 1.0;for(unsigned int i = 1; i <= exponent; i++){result *= base;}return result;}double Power(double base,int exponent){InvaildeInput = false;if (equal(base,0.0) && exponent < 0){InvaildeInput = true;return 0.0;}unsigned int UnsignedExponent = (unsigned int)exponent;if (exponent < 0){UnsignedExponent = (unsigned int)(-exponent);}double result = PowerUnsignedExponent(base,UnsignedExponent);if (exponent < 0){result = 1.0 / result;}return result;}

问题总结

在此基础上,还有使用位运算来优化该算法的方法。这里并没有讨论,还是想说要多思考,多写。


0 0
原创粉丝点击