zoukankan      html  css  js  c++  java
  • 数值的整数次方

    题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

    这个题看似很简单,貌似用一个循环就能解决问题。就像下面这样:

    double Power(double base, int exponent) {
           double ret = 1.0;
           for(int i=1; i<=exponent; i++)
               ret *= base;
           return ret;              
    }

    可是这是万万不够的,要写出正确高质量的代码还需要斟酌一下,首先得考虑base为0并且指数为负数的情况,不然会出现0作为分母的情况。还有指数为负数的情况,得把指数先当正数算,然后把结果取倒数即可。还有要考虑double的误差,在计算机中不能用==来判断两个double是不是相等,需要特殊处理。这还没完,上面的写法效率也有待提高。实际上,还有一种更高效的算法。举个栗子,要算一个数的8次方,那么知道4次方再平方就可以了。要算4次方,知道2次方再平方就可以了。。。。还可以使用位运算来进一步提高效率。根据这个思想我们不难得出一个公式:

    an/2*an/2    n为偶数

    a=                                     

         a(n-1)/2*a(n-1)/2*a    n为奇数 

    考虑到这些情况我们就不难写出下面比较完整的代码了:

    public class Solution {
        public double Power(double base, int exponent) {
            if(exponent == 0)
                return 1.0;
            if(exponent == 1)
                return base;
            
            if(isDoubleEqual(base, 0.0) && exponent < 0)
                return 0.0;
            int ex = exponent<0?-exponent:exponent; //考虑指数是负数的情况
            
            double ret = Power(base, ex >> 1);
            ret *= ret;
            if((exponent & 1) == 1) {
                ret *= base;
            }
            
            ret = exponent<0?(1.0/ret):ret;
            
            return ret;
        }
        //判断两个double是否相等,要计算误差
        public boolean isDoubleEqual(double a, double b) {
            if(a - b > -0.0000001 && a - b < 0.0000001) {
                return true;
            }
            else {
                return false;
            }
        }
    }
  • 相关阅读:
    Python之路,day16-Python基础
    Python之路,day15-Python基础
    Python之路,day14-Python基础
    django之model操作
    django信号
    django缓存
    CSRF的攻击与防范
    cookie和session
    http协议之Request Headers
    ajax参数详解
  • 原文地址:https://www.cnblogs.com/wxisme/p/5251239.html
Copyright © 2011-2022 走看看