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; } };