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

需要注意的地方:
1)输入的指数小于1即是零和负数的情况;
2)指数是负数时需要取倒数,当底数是0时的情况;
3)0的0次方无论输出0或1都可以接受;
4)为了区分是出错的时候返回的0,还是底数为0的时候正常运行返回0,我们需要定义了一个全局变量g_InvalidInput;
5)判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围内。如果两个数相差很小,就可以认为它们相等;
6)有个快捷的公式a的n次方={a的n/2次方 * a的n/2次方  当n为偶数时;  a的(n-1)/2次方 * a的(n-1)/2次方 * a n为奇数};
7)用右移运算符替代了除以2,用位与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数。
 
测试用例:
把底数和指数分别设为正数、负数和零。
 
代码实现:
package com.yyq;

/**
* Created by Administrator on 2015/9/11.
*/
public class Power {
public static boolean g_InvalidInput = false;
public static double Power(double base, int exponent){
g_InvalidInput = false;
if(equal(base,0.0) && exponent < 0){
g_InvalidInput = true;
return 0.0;
}
int absExponent = exponent;
if (exponent < 0){
absExponent = -1 * exponent;
}
double result = PowerWithUnsignedExponent(base, absExponent);
if (exponent < 0){
result = 1.0 / result;
}
return result;
}
public static double PowerWithUnsignedExponent(double base, int exponent){
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if((exponent & 0x1)==1){
result = result * base;
}
return result;
}
public static boolean equal(double num1, double num2){
if ((num1 - num2 > -0.0000001) && (num1 -num2 < 0.0000001))
return true;
else
return false;
} // ====================测试代码====================
public static void Test(double base, int exponent, double expectedResult, boolean expectedFlag)
{
double result = Power(base, exponent);
if((result - expectedResult) < 0.00000001 && (result - expectedResult) > -0.00000001
&& g_InvalidInput == expectedFlag)
System.out.println("Test passed.");
else
System.out.println("Test failed.");
System.out.println();
} public static void main(String[] args){ // 底数、指数都为正数
System.out.println("Test1 begins.");
Test(2, 3, 8, false); // 底数为负数、指数为正数
System.out.println("Test2 begins.");
Test(-2, 3, -8, false); // 指数为负数
System.out.println("Test3 begins.");
Test(2, -3, 0.125, false); // 指数为0
System.out.println("Test4 begins.");
Test(2, 0, 1, false); // 底数、指数都为0
System.out.println("Test5 begins.");
Test(0, 0, 1, false); // 底数为0、指数为正数
System.out.println("Test6 begins.");
Test(0, 4, 0, false); // 底数为0、指数为负数
System.out.println("Test7 begins.");
Test(0, -4, 0, true); }
}
 
输出结果:
Test1 begins.
Test passed.
 
Test2 begins.
Test passed.
 
Test3 begins.
Test passed.
 
Test4 begins.
Test passed.
 
Test5 begins.
Test passed.
 
Test6 begins.
Test passed.
 
Test7 begins.
Test passed.

P90、面试题11:数值的整数次方的更多相关文章

  1. 剑指offer编程题Java实现——面试题11数值的整数次方

    题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值 ...

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

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

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

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

  4. 剑指offer-面试题11.数值的整数次方

    题目:实现函数double Power(double base,int exponent),求base的 exponent次方.不得使用库函数,同时不需要考虑大数的问题. 这道题看似很简单: 然而需要 ...

  5. 《剑指offer》面试题11 数值的整数次方 Java版

    书中方法:这道题要注意底数为0的情况.double类型的相等判断.乘方的递归算法. public double power(double base, int exponent){ //指数为0 if( ...

  6. 【剑指offer】面试题 16. 数值的整数次方

    面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ...

  7. 《剑指offer》面试题16. 数值的整数次方

    问题描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入: 2.0 ...

  8. 《剑指offer》第十六题(数值的整数次方)

    // 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...

  9. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  10. 剑指offer——面试题16:数值的整数次方

    // 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...

随机推荐

  1. C# 在运行时动态创建类型

    C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译 ...

  2. 前端工程模块化——以一个php项目为例

    实现一个页面功能总是需要 JavaScript.CSS 和 Template 三种语言相互组织,所以我们真正需要的是一种可以将 JavaScript.CSS 和 Template 同时都考虑进去的模块 ...

  3. jquery返回顶部特效

    <style> p#back-to-top{position:fixed; bottom:100px;right:10px; display: none; } p#back-to-top ...

  4. Winform 异步更新listbox

    public partial class Form1 : Form { private BackgroundWorker bw; public Form1() { InitializeComponen ...

  5. T-SQL实例 函数结果设置为列别名

    本文分享一个T-SQL的例子,将自定义函数的结果作为别名列,是个不错的应用实例,有兴趣的朋友研究下. T-SQL实例,学习下将函数结果作为别名列的方法. 代码: view source print? ...

  6. MySQL的varchar定义长度到底是字节还是字符

    相信这个问题也会困扰不少人,尤其是使用过其它数据库(如Oracle)的人,之前我也没有太在意这个问题,再加上一些书籍和网上的文章讲的不够细致,又没测试过,导致我一直理解错误.下面通过实例来解释,在开始 ...

  7. FireDAC如何连接ORACLE数据库

    UniDac对Oracle的Direct连接,不需要安装Oracle客户端dll,deploy时真的是方便又快捷. FireDac连接Oracle,在没有Oracle Client的情况下,是可以连接 ...

  8. iphone开发第二个程序

    此程序包括UIProgressView,UIButton, UIDatePicker,UIAlert,UILabel,NSTimer // //  HViewController.h //  Btn_ ...

  9. 使用OpenXml操作Excel,以下方法用于在添加列时修改Cell的CellReference属性。

    以下方法实现了递增Excel中单元格的CellReference的功能,只支持两位字母. public static string CellReferenceIncrement(string cell ...

  10. jsp分页代码之pageUtil类

    pageUtil类负责得到每页的开始数和结束数 package control; public class PageUtil { private int pageSize;//每页显示的条数 priv ...