前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指Offer面试题:10.数值的整数次方

剑指Offer面试题:10.数值的整数次方

作者头像
Edison Zhou
发布2018-08-20 16:50:06
4360
发布2018-08-20 16:50:06
举报
文章被收录于专栏:EdisonTalkEdisonTalk

一、题目:数值的整数次方

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

  在.NET Framework提供的BCL中,Math类实现了一个Pow方法,例如要求2的三次方,可以通过以下代码实现:

代码语言:javascript
复制
    double result = Math.Pow(2, 3);

  本题就是要实现一个类似于该Pow方法的功能。

二、解决思路与实现

2.1 不加思索的思路

  不需要考虑大数问题,可以在30秒内想到的思路如下:

代码语言:javascript
复制
    public double Power(double baseNumber,int exponent)
    {
        double result = 1;
        for (int i = 1; i <= exponent; i++)
        {
            result = result * baseNumber;
        }

        return result;
    }

  但是,上面的代码没有考虑到输入的指数(exponent)小于1即是零和负数的时候怎么办,它只考虑了指数是正数的情况。

2.2 全面考虑的思路

  (1)当指数为负数的时候:可以先对指数求绝对值,然后算出次方的结果之后再取倒数

  (2)当底数(base)是零且指数是负数的时候:通过全局代码或异常告诉调用者参数有误

  (3)0的0次方的时候:由于0的0次方在数学上是没有意义的,因此无论是输出0还是1都是可以接受的。

代码语言:javascript
复制
    public static bool isInvalidInput = false;

    public static double Power(double baseNumber, int exponent)
    {
        isInvalidInput = false;

        // 当底数(base)是零且指数是负数的时候提示参数非法
        if (Equals(baseNumber, 0.0) && exponent < 0)
        {
            isInvalidInput = true;
            return 0.0;
        }

        uint absExponent = (uint)exponent;
        if (exponent < 0)
        {
            absExponent = (uint)(-1 * exponent);
        }

        double result = PowerWithUintExponent(baseNumber, absExponent);

        // 当指数为负数的时候需算出次方的结果之后再取倒数
        if(exponent < 0)
        {
            result = 1.0 / result;
        }

        return result;
    }

    private static double PowerWithUintExponent(double baseNumber, uint exponent)
    {
        double result = 1.0;
        for (int i = 1; i <= exponent; i++)
        {
            result = result * baseNumber;
        }

        return result;
    }

    /// <summary>
    /// 在判断底数base是不是等于0时,不能直接写base==0,
    /// 这是因为在计算机内表示小数时(包括float和double型小数)都有误差。
    /// </summary>
    private static bool Equal(double num1, double num2)
    {
        if (num1 - num2 > -0.0000001 &&
            num1 - num2 < 0.0000001)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

细节:在判断底数baseNumber是不是等于0时,不能直接写baseNumber==0,这是因为在计算机内表示小数时(包括float和double型小数)都有误差。判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围内。如果两个数相差很小,就可以认为它们相等。

三、单元测试

3.1 测试用例

代码语言:javascript
复制
    // 底数、指数都为正数
    [TestMethod]
    public void PowerTest1()
    {
        Assert.AreEqual(PowerHelper.Power(2, 3), 8);
    }

    // 底数为负数、指数为正数
    [TestMethod]
    public void PowerTest2()
    {
        Assert.AreEqual(PowerHelper.Power(-2, 3), -8);
    }

    // 指数为负数
    [TestMethod]
    public void PowerTest3()
    {
        Assert.AreEqual(PowerHelper.Power(2, -3), 0.125);
    }

    // 指数为0
    [TestMethod]
    public void PowerTest4()
    {
        Assert.AreEqual(PowerHelper.Power(2, 0), 1);
    }

    // 底数、指数都为0
    [TestMethod]
    public void PowerTest5()
    {
        Assert.AreEqual(PowerHelper.Power(0, 0), 1);
    }

    // 底数为0、指数为正数
    [TestMethod]
    public void PowerTest6()
    {
        Assert.AreEqual(PowerHelper.Power(0, 4), 0);
    }

    // 底数为0、指数为负数
    [TestMethod]
    public void PowerTest7()
    {
        Assert.AreEqual(PowerHelper.Power(0, -4), 0);
        Assert.AreEqual(PowerHelper.isInvalidInput, true);
    }

3.2 测试结果

  (1)测试通过结果

  (2)代码覆盖率结果

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目:数值的整数次方
  • 二、解决思路与实现
    • 2.1 不加思索的思路
      • 2.2 全面考虑的思路
      • 三、单元测试
        • 3.1 测试用例
          • 3.2 测试结果
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档