12 数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 
常规解法:
 
注意1double类型不能直接和0进行比较;
       2 要判断底数是否为0,要判断指数是否为负数;用一个变量先记录,然后统一使用正的指数进行计算。
      3 最后如果是负数需要将结果取倒数,而且前面要分奇数和偶数进行计算。
class Solution {
public:
    double Power(double base, int exponent) {
        if(base < 0.000001 && base > -0.000001){
            return 0.0;
        }
        if(exponent == 0){
            return 1.0;
        }
        int tmp = abs(exponent);
        double res = Power(base,tmp >> 1);
        res *= res;
        if(tmp % 2 == 1){
            res *= base;
        }
        if(exponent < 0){
            res = 1.0 / res;
        }
        return res;
    }
};

 

解法2:快速幂。

tmp & 1 == 1,只能判断最后一位,0011 & 0010 = 0010 = 2.

快速幂的原理相当于将指数变为二进制,分别计算每一二进制位的值然后相乘。

一定记住对于这种有指数的一定要判断是否为负数,将负数转化为整数计算后取反,当然必须判断底数不为0;

 if(1 & tmp){
      res = res * base;
}
 base = base * base;
 tmp = tmp >> 1;
class Solution {
public:
    double Power(double base, int exponent) {
        if((base < 0.00001) && (base > -0.00001)){
            return 0.0;
        }
        if(exponent == 0){
            return 1.0;
        }        
        double res = 1.0;        
        int tmp = abs(exponent);
        while(tmp){
            if(1 & tmp){
                res = res * base;
            }
            base = base * base;
            tmp = tmp >> 1;
        }
        if(exponent < 0){
            res = 1.0 / res;
        }
        return res;
    }
};

 

 

posted @ 2017-11-29 20:14  zqlucky  阅读(160)  评论(0编辑  收藏  举报