题目:实现函数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. TIMAC 学习笔记(三)

    本文主要内容参考 <Security on TI IEEE 802.15.4 Compliant RF Devices>.<Design Note DN108>.<IEE ...

  2. 处理器在 protected mode 下的 protection

    前言 实模式,保护模式,分段,分页,虚拟内存,内核态,用户态,如果你对这些术语之间的关系非常熟悉,那就不用继续看了.这篇主要记录我对用户态/内核态的一些理解,如有不对还请指教. 下述说明均为 x86- ...

  3. Asp.Net Web API VS Asp.Net MVC

    http://www.dotnet-tricks.com/Tutorial/webapi/Y95G050413-Difference-between-ASP.NET-MVC-and-ASP.NET-W ...

  4. 彻底删除sql server的方法

    请先确定是否把sql相关的东西删了,建议进行如下操作. 1.先下个Windows Install Clean Up,清理sql相关东西,要全部清理. 2.到控制面板--添加删除程序中看是否还有未删的. ...

  5. 将Ecshop后台fckeditor升级更改为kindeditor 4.1.10编辑器

    ecshop在win8部分电脑上,不管用任何浏览器,都打不开,即使升级到最新版本都不行,问题应该吃在fckeditor兼容上.fckeditor 很久未升级,换掉该编辑器是最佳方法 第一步:下载kin ...

  6. 64位Python安装PIL

    写个小程序需要安装PIL,但是官网只有32位,无法找到64位安装路径.根据网上教程自行编译,但是由于VS版本问题总是提示“Python error: Unable to find vcvarsall. ...

  7. Linux进程间通信IPC学习笔记之有名管道

    基础知识: 有名管道,FIFO先进先出,它是一个单向(半双工)的数据流,不同于管道的是:是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)有一个与路径名关联的名 ...

  8. ItemsControl 使用Grid布局

    ItemsControl控件经常用到,在ItemsPanel里大多是StackPanel,WrapPanel,以下项目演示如何使用Grid用于ItemsControl布局 1.先看运行效果 2.xam ...

  9. img test

  10. Java 多线程 简单实例 (Runnable)

    1.多线程实例 package second; public class A implements Runnable { public char stat = '*'; public void run ...