数值的整数次方

  • 题目:实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题。
  • 思路分析:C语言的库中有一个pow函数可以用来求乘方,本题要求实现类似的功能。虽然看起来很容易实现,但是其中包含着很多的小细节需要去考虑,不信我们一起来看一看。
    (1)解法一
double Power(double base, int exponent)
{
    double result = 1.0;
    for(int idx = 0; idx < exponent ++idx)
    {
         result *= base;
    }
    return result;
}

上述代码看似实现了我们所需要的功能,但是如果exponent是负数呢,并且我们知道指数为负数时,我们需要对指数求绝对值,而且对底数求出次方后要进行求倒,那么底数为0怎么办呢?我们不可以对0求倒的。这就是我们需要考虑的第一个小细节。
接下来我们对代码进行适当的改写。
(2)解法二

int equal(double num1, double num2)
{
    if ((num1 - num2) > -0.0000001 && (num1 - num2) < 0.0000001)
        return 1;
    else
        return 0;
}
double Unsignedexponent1(double base, unsigned int exponent)
{
    double result = 1.0;
    for (unsigned int i = 0; i < exponent; ++i)
    {
        result *= base;
    }
    return result;
}
double Power(double base, int exponent)
{
    if (equal(base, 0.0) && exponent < 0)
    {
        printf("Div 0 operation\n");
        return 0.0;
    }
    unsigned int absexponent = (unsigned int)exponent;
    if (exponent < 0)
        absexponent = (unsigned int)(-exponent);
    double result = Unsignedexponent1(base, absexponent);
    if (exponent < 0)
        result = 1.0 / result;
    return result;
}

上述代码对我们的负数以及对0求倒的问题做了解决,我们发现代码加了一个equal函数,这就是我们需要注意的第二个小细节。因为计算机表示小数(double和float型小数)都由误差,我们不能用“ ==”来判断两个小数是否相等。
如果我们是去面试,为了能够更有把握的拿到offer我们需要学会更有效率的解法。让面试官看到我们的能力
(3)解法三:如果输入的exponent比较大,例如32我们就需要昨31次乘法,如果我们知道这个数的16次方,那我们只需要在16次方的基础上在平方一次就可以了,而16又是8的平方,以此类推32只需要作5次乘法,那么如果指数是奇数呢,很简单例如x的31次方就可以表示为x的15次方乘以x的15次方再乘以x,这样我们就不难写出程序了。

int equal(double num1, double num2)
{
    if ((num1 - num2) > -0.00000001 && (num1 - num2) < 0.00000001)
        return 1;
    else
        return 0;
}
double Unsignedexponent(double base, unsigned int exponent)
{
    if (0 == exponent)
        return 1.0;
    if (1 == exponent)
        return base;
    double result = 1.0;
    result = Unsignedexponent(base, exponent >> 1);
    result *= result;
    if (1 == (exponent & 1))//判断指数的奇偶性
        result *= base;
    return result;
}
double Power(double base, int exponent)
{
    if (equal(base, 0.0) && exponent < 0)
    {
        printf("Div 0 operation\n");
        return 0.0;
    }
    unsigned int absexponent = (unsigned int)exponent;
    if (exponent < 0)
        absexponent = (unsigned int)(-exponent);
    double result = Unsignedexponent1(base, absexponent);
    if (exponent < 0)
        result = 1.0 / result;
    return result;
}

小细节3采用右移一位的操作代替/2,采用按位与的操作来代替%,可以大大提高程序的效率。以后的代码也可以采用这种写法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值