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

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

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

    double result = Math.Pow(, );

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

二、解决思路与实现

2.1 不加思索的思路

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

    public double Power(double baseNumber,int exponent)
{
double result = ;
for (int i = ; i <= exponent; i++)
{
result = result * baseNumber;
} return result;
}

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

2.2 全面考虑的思路

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

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

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

    public static bool isInvalidInput = false;

    public static double Power(double baseNumber, int exponent)
{
isInvalidInput = false; // 当底数(base)是零且指数是负数的时候提示参数非法
if (Equals(baseNumber, 0.0) && exponent < )
{
isInvalidInput = true;
return 0.0;
} uint absExponent = (uint)exponent;
if (exponent < )
{
absExponent = (uint)(- * exponent);
} double result = PowerWithUintExponent(baseNumber, absExponent); // 当指数为负数的时候需算出次方的结果之后再取倒数
if(exponent < )
{
result = 1.0 / result;
} return result;
} private static double PowerWithUintExponent(double baseNumber, uint exponent)
{
double result = 1.0;
for (int i = ; 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 测试用例

    // 底数、指数都为正数
[TestMethod]
public void PowerTest1()
{
Assert.AreEqual(PowerHelper.Power(, ), );
} // 底数为负数、指数为正数
[TestMethod]
public void PowerTest2()
{
Assert.AreEqual(PowerHelper.Power(-, ), -);
} // 指数为负数
[TestMethod]
public void PowerTest3()
{
Assert.AreEqual(PowerHelper.Power(, -), 0.125);
} // 指数为0
[TestMethod]
public void PowerTest4()
{
Assert.AreEqual(PowerHelper.Power(, ), );
} // 底数、指数都为0
[TestMethod]
public void PowerTest5()
{
Assert.AreEqual(PowerHelper.Power(, ), );
} // 底数为0、指数为正数
[TestMethod]
public void PowerTest6()
{
Assert.AreEqual(PowerHelper.Power(, ), );
} // 底数为0、指数为负数
[TestMethod]
public void PowerTest7()
{
Assert.AreEqual(PowerHelper.Power(, -), );
Assert.AreEqual(PowerHelper.isInvalidInput, true);
}

3.2 测试结果

  (1)测试通过结果

  (2)代码覆盖率结果

作者:周旭龙

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

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

剑指Offer面试题:10.数值的整数次方的更多相关文章

  1. 剑指Offer:面试题11——数值的整数次方(java实现)

    题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...

  2. 剑指Offer - 九度1514 - 数值的整数次方

    剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...

  3. 剑指offer_面试题11 数值的整数次方_考察代码的完整性

    测试通过代码: package t0825; public class Power { public static void main(String[] args){ System.out.print ...

  4. 剑指offer十二之数值的整数次方

    一.题目 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.思路 1.传统方法计算,时间复杂度O(n) 2.递归方式计算,时间复杂度O ...

  5. 剑指offer(12)数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目分析 这道题用传统的方法也可以做,只不过效率太低,这里我们用到快速幂的方法 ...

  6. 【剑指Offer】12、数值的整数次方

      题目描述:   给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   解题思路:   本题看似比较简单,是一个简单的指数运算,但需要完 ...

  7. 剑指offer 面试题43. 1~n整数中1出现的次数

    leetcode上也见过一样的题,当时不会做 看了一下解法是纯数学解法就没看,结果剑指offer上也出现了这道题,那还是认真看下吧 对于数字abcde,如果第一位是1,比如12345,即计算f(123 ...

  8. 剑指offer——面试题10:斐波那契数列

    个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...

  9. 剑指Offer面试题10(Java版):二进制中的1的个数

    题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和 ...

  10. 剑指offer 面试题10.2:青蛙变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...

随机推荐

  1. Selenium 简单的例子

    Selenium是一个web自动化验收测试框架.   Selenium Client Driver - Selenium 2.0 Document http://seleniumhq.github.i ...

  2. 用python DIY一个图片转pdf工具并打包成exe

    最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用python自己DIY一下: 这里主要用了reportlab.开始打算随便写几行,结果为若干坑纠结了挺久,于 ...

  3. 2016-11-05实战-定义ssh服务的日志

    1.编辑/etc/rsyslog.conf 输入 local 0 .*     /var/log/sshd.log   #日志的保存路径 2.定义ssh服务的日志级别 编辑sshd服务的主配置文件:/ ...

  4. Spring MVC初次相见

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  5. [转载] SSH入门学习基础教程

    在Linux系统中,OpenSSH是目前最流行的远程系统登录与文件传输应用,也是传统Telenet.FTP和R系列等网络应用的换代产品.其 中,ssh(Secure Shell)可以替代telnet. ...

  6. 杨氏矩阵定义及其查找的实现C++

    先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为: 1.  每一 ...

  7. su root认证失败的解决方法

    sudo passwd 输入安装密码. 输入新密码. 输入 su 即获得root权限.

  8. EditText限制小数点前后位数

    在EditText输入数字的时候,通常我们需要限制小数点前后位数.比如金额输入一般我们需要限制小数点后面最多2位.我们可以通过 TextWatcher 实现. public class MyWatch ...

  9. Web API Get Started First

    注:此博客是自官网修剪而来,博主IT新手 一.web api与web service的不同: web api是基于Http协议,而web service是基于soap协议.两协议的区别小子看了很多,但 ...

  10. C#输出文本树形层次,前或者后自定义空格位数

    Indent String with Spaces This example shows how to indent strings using method for padding in C#. T ...