zoukankan      html  css  js  c++  java
  • 剑指offer编程题Java实现——面试题11数值的整数次方


    题目:

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

    解题思路:最一般的方法实现数值的n次方就是将一个数自身连乘n次
    底数要考虑到正数、负数和零的情况
    指数要考虑到正整数,负整数和零的情况。可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理
    指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果
    解法一:全面不高效,考虑到所有边界条件和负面测试使用循环计算乘方
    解法二:全面高效完美的算法,使用公式,利用递归实现,减少计算次数

    a^n=a^(n/2)*a^(n/2)    n是偶數

    a^n=a^(n/2)*a^(n/2)&a   n是奇数

     1 package Solution;
     2 /**
     3  * 剑指offer面试题11:数值的整数次方
     4  * 题目:实现函数double power(double base,int exponent),求base的exponent次方。
     5  * 不得使用库函数,同时不需要考虑大数问题。
     6  * 解题思路:实现数值的n次方就是将一个数自身连乘n次
     7  * 底数要考虑到正数、负数和零的情况
     8  * 指数要考虑到正整数,负整数和零的情况。因此可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理
     9  * 指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果
    10  * 解法一:全面不高效,考虑到所有边界条件和负面测试
    11  * 解法二:全面高效完美的算法,使用公式a^n=a^(n/2)*a^(n/2)    n是偶數
    12  *                                   a^(n/2)*a^(n/2)&a    n是奇数    
    13  * @author GL
    14  *
    15  */
    16 public class No11Power {
    17 
    18     public static void main(String[] args) {
    19         System.out.println("底数为2,指数为2运算结果为:"+power(2,2));
    20         System.out.println("底数为2,指数为-2运算结果为:"+power(2,-2));
    21         System.out.println("底数为2,指数为0运算结果为:"+power(2,0));
    22         System.out.println("底数为-2,指数为2运算结果为:"+power(-2,2));
    23         System.out.println("底数为-2,指数为-2运算结果为:"+power(-2,-2));
    24         System.out.println("底数为-2,指数为0运算结果为:"+power(-2,0));
    25         System.out.println("底数为0,指数为2运算结果为:"+power(0,2));
    26         System.out.println("底数为0,指数为0运算结果为:"+power(0,0));
    27         System.out.println("底数为2,指数为1运算结果为:"+power(2,1));
    28         System.out.println("底数为0,指数为-2运算结果为:"+power(0,-2));
    29     }
    30 
    31     public static double power(double base,int exponent){
    32         if(equal(base,0.0)&&exponent<0)
    33             throw new RuntimeException("while exponent is minus,the base can't be zero");
    34         int absExponent=exponent;
    35         if(exponent<0)
    36             absExponent=~exponent+1;//整数按位取反+1得到他的相反数
    37         //double result=powerWithUnsignedExponent(base,absExponent);
    38         double result= powerWithUnsignedExponentByRecursion( base, absExponent);
    39         if(exponent<0)
    40             result=1.0/result;
    41         return result;
    42     }
    43     //解法一:求指数为非负数时候的乘方运算,连乘
    44     private static double powerWithUnsignedExponent(double base, int absExponent) {
    45         double result=1.0;
    46         for(int i=1;i<=absExponent;i++){
    47             result=result*base;
    48         }
    49         return result;
    50     }
    51 
    52     //解法二:计算一个数的乘方的时候,通过计算指数的一半次,得到的结果相乘即可得到,这样计算量会大大减少
    53     private static double powerWithUnsignedExponentByRecursion(double base,int exponent){
    54         if(exponent==0)
    55             return 1.0;
    56         if(exponent==1)
    57             return base;
    58         double result= powerWithUnsignedExponentByRecursion(base,exponent>>1);
    59         result=result*result;
    60         if((exponent&0x1)==1)
    61             result=result*base;
    62         return result;
    63     }
    64     
    65 
    66     //浮点数由于精度问题不能用==判断是否想等,如果两数满足一定条件精度,可以看做相等
    67     private static boolean equal(double number1,double number2){
    68         if(number1-number2>-0.0000001&&(number1-number2)<0.0000001)
    69             return true;
    70         return false;
    71     }
    72 }
  • 相关阅读:
    Bootstrap中,模态框嵌套模态框时,关闭第二个模态框时,导致第一个模态框的滚动条消失
    heidisql 远程登录本地虚拟机中的 MariaDB
    ssh-keygen -t rsa -C "content" 解释
    IIS 环境 CodeIgniter 隐藏 URL 中的 index.php
    Windows 环境下 PHP 安装 xdebug 及配置
    win10 更新后主机背部音频输出无声音
    MySql.Data.MySqlClient.MySqlException: Packets larger than max_allowed_packet are not allowed
    关于 IIS 中 iconfont.woff 报 404(Not Found) 的原因即解决方法
    IIS Web API 长时间不连接后第一次访问非常缓慢
    VS Code 中 HTML 文档注释 js 语句异常
  • 原文地址:https://www.cnblogs.com/gl-developer/p/6475399.html
Copyright © 2011-2022 走看看