剑指Offer面试题:10.数值的整数次方
一、题目:数值的整数次方
题目:实现函数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)代码覆盖率结果

剑指Offer面试题:10.数值的整数次方的更多相关文章
- 剑指Offer:面试题11——数值的整数次方(java实现)
题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...
- 剑指Offer - 九度1514 - 数值的整数次方
剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...
- 剑指offer_面试题11 数值的整数次方_考察代码的完整性
测试通过代码: package t0825; public class Power { public static void main(String[] args){ System.out.print ...
- 剑指offer十二之数值的整数次方
一.题目 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.思路 1.传统方法计算,时间复杂度O(n) 2.递归方式计算,时间复杂度O ...
- 剑指offer(12)数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目分析 这道题用传统的方法也可以做,只不过效率太低,这里我们用到快速幂的方法 ...
- 【剑指Offer】12、数值的整数次方
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解题思路: 本题看似比较简单,是一个简单的指数运算,但需要完 ...
- 剑指offer 面试题43. 1~n整数中1出现的次数
leetcode上也见过一样的题,当时不会做 看了一下解法是纯数学解法就没看,结果剑指offer上也出现了这道题,那还是认真看下吧 对于数字abcde,如果第一位是1,比如12345,即计算f(123 ...
- 剑指offer——面试题10:斐波那契数列
个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...
- 剑指Offer面试题10(Java版):二进制中的1的个数
题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和 ...
- 剑指offer 面试题10.2:青蛙变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...
随机推荐
- F#之旅4 - 小实践之快排
参考文章:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/fvsc-quicksort.html F#之旅4 - 小 ...
- Python-函数的返回值
特点: - 函数被调用后会返回一个指定的值 - 函数调用后默认返回none - return用于函数内部返回值 - 返回值可以是任意类型 - return执行后,函数终止 注意: 所有函数默认都有 ...
- windows 查看软件是32位还是64位
我有一个配置挺好的电脑,win10 64位的系统,但是最近下载的一个软件用着巨慢,导致我严重想知道下载的软件是64位的还是32位的 百度谷歌了很久,大多数都说是两个方法: 1. 判断文件的安装路径,如 ...
- 移动适配请使用比rem等更好的布局方案
移动端大行其道,rem/em.百分比.响应式方案更是层出不穷,看见周围的伙伴们都在对使用rem和百分比情有独钟,可我却偏不爱,之所以出现如此多的方法,其目的只有一个屏幕适配. 屏幕适配顾名思义 ...
- Linux学习笔记(12)-进程间通信|匿名管道
Linux的进程间通信有几种方式,包括,管道,信号,信号灯,共享内存,消息队列和套接字等-- 现在一个个的开始学习! ----------------------------------------- ...
- 十个免费的web应用安全检测工具
Websites are getting more and more complex everyday and there are almost no static websites being bu ...
- 使用命令行+ideal 工具实现本地代码项目提交
在 OSChina 上建立一个私用的项目 mkdir test cd test git init touch README.md git add README.md git commit -m &qu ...
- BaaS、IaaS、PaaS、SaaS
参考资料:http://www.zhihu.com/question/23048744
- iTunes使用总结
UDID查询 将设备连接至电脑,打开iTunes至设备摘要页面,鼠标点击"序列号"区域切换显示UDID
- yotaku的开发日志(1)
2015-12-18 21:17:46 连续看了几天的ThinkPHP框架,目前看到基于角色的用户访问权限控制. 相关代码如下: 数据库 用户表(管理员) mg_id mg_name mg_pwd m ...