牛客网刷题之数值的整数次方

来源:互联网 发布:支付宝软件下载 编辑:程序博客网 时间:2024/06/05 16:33

题目描述:

这里写图片描述

解题思路:

  其实,题目本身是没有难度的,只不过是要考虑周全,并在普通解法上进行优化就行了。分别考虑expont大于零以及小于零时,还有expont为零以及base为零的情况,加上条件语句就可以写好普通解法:
  

public double Power(double base, int exponent) throws Exception {        double result = 1;        if(base == 0){            throw new Exception("底数不能为0");        }        else if(exponent == 0){            return 1;        }        else if(exponent > 0){            for(int i =1 ; i <= exponent ; i ++){                result *= base;            }            return result;            }else{                for(int i = 1 ; i <= (-exponent) ; i ++){                    result *= base;                }                return 1/result;        }      }

这里写图片描述
这种强解法的复杂度是O(n)的,当然还有稍微好一点的解法:
当n为偶数时 base^n = base^(n/2) * base^(n/2)
当n为偶数时 base^n = base^(n/2) * base^(n/2) *base,这样的话就可以递归求出(n/2)时的大小,最后只只需要判断传入的expont的奇偶行再进行一步运算就可以了。这样的话,复杂度就是O(logn)了。

题解:

public double Power(double base, int exponent) throws Exception {        double result = 1;         if(base == 0){                throw new Exception("底数不能为0");            }            else if(exponent == 0){                return 1;            }         int n = exponent > 0 ? exponent : (-exponent);         result = Power(base, n >> 1);         result *= result;         if((n &0x1) == 1){             result *= base;         }        return exponent > 0 ? result : 1/result;    }

ac结果:

这里写图片描述

0 0