剑指offer 数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:底数是double类型的浮点数, 指数是int类型:包括0,正负整数。
考虑异常情况:
1)0的0次方。
2)底数为0.0时,指数是负整数。
代码一:排除异常情况后,求次幂用递归
1 class Solution { 2 private: 3 bool equal(double i, double j) { 4 //判断两个浮点类型数是否相等 5 if ((i - j) < 1e-8 && (i - j) > -1e-8) { 6 return true; 7 } else { 8 return false; 9 } 10 } 11 double power(double base, int exponent) { 12 //当指数为0时,返回1 13 if (exponent == 0) { 14 return 1; 15 } 16 //用移位操作代替/2, 效率快很多, 此时res = base ^ (exponent / 2) 17 double res = power(base, exponent >> 1); 18 // res = base ^ ((exponent / 2) * 2) 19 res *= res; 20 //如果为奇数,res = res * base; 21 if (exponent & 1) { 22 res *= base; 23 } 24 return res; 25 } 26 public: 27 double Power(double base, int exponent) { 28 if (equal(base, 0.0) && exponent <= 0) { 29 return 0.0; 30 } 31 int p = abs(exponent); 32 double res = power(base, p); 33 return exponent < 0 ? (1.0 / res) : res; 34 } 35 };
代码二:快速幂运算
加入底数为a, 指数为11, 我们要求a^11, 11的二进制表示为1011, 于是a^11 = a^(8+2+1) = a^(1000) * a^(0010) * a^(0001)
1 class Solution { 2 private: 3 bool equal(double i, double j) { 4 //判断两个浮点类型数是否相等 5 if ((i - j) < 1e-8 && (i - j) > -1e-8) { 6 return true; 7 } else { 8 return false; 9 } 10 } 11 public: 12 double Power(double base, int exponent) { 13 if (equal(base, 0.0) && exponent <= 0) { 14 //throw new RuntimeException("Denominator cannot be zero"); 15 return 0.0; 16 } 17 int p = abs(exponent); 18 double res = 1.0; 19 while (p) { 20 if (p & 1) { 21 res *= base; 22 } 23 p >>= 1; 24 base *= base; 25 } 26 return exponent > 0 ? res : 1.0 / res; 27 } 28 };
越努力,越幸运