数值的整数次方
- 参与人数:2805时间限制:1秒空间限制:32768K
- 通过比例:25.32%
- 最佳记录:0 ms|0K(来自 我是小码农)
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
1 /* 解法1: 2 注意考虑指数exponent为负数的情况! 3 此方法的时间复杂度为O(n),循环次数为abs(exponent)次。 4 */ 5 class Solution { 6 public: 7 double PowerWithAbsExponent(double base, int exponent){ 8 double result = 1.0; 9 for (int i = 0; i < abs(exponent); i++) 10 result *= base; 11 return result; 12 } 13 double Power(double base, int exponent) { 14 // base^0 = 1.0 15 if (exponent == 0) 16 return 1.0; 17 // 0.0^exponent = 0.0 18 if ( (base - 0.0 > -0.0000001) && (base - 0.0 < 0.0000001) ) 19 return 0.0; 20 double result = PowerWithAbsExponent(base, abs(exponent)); 21 if (exponent < 0){ // 若exponent为负数,则结果取倒数 22 result = 1.0/result; 23 } 24 return result; 25 } 26 };
1 /* 解法2: 2 由于: 3 若n为偶数,则 a^n = a^(2/n) * a^(2/n); 4 若n为奇数,则 a^n = a^(2/n) * a^(2/n) * a. 5 因此,可以由此优化解法1. 6 该解法的时间复杂度为 O(logn)。 7 */ 8 class Solution { 9 public: 10 double PowerWithAbsExponent(double base, int exponent){ 11 if (exponent == 0) 12 return 1.0; 13 double result = PowerWithAbsExponent(base, exponent >> 1); // 使用右移>>操作除2的效率更高! 14 result *= result; 15 if (exponent & 1 == 1) // 判断exponent是否为奇数:用位与运算符代替求余运算符(%) 16 result *= base; 17 return result; 18 } 19 double Power(double base, int exponent) { 20 // base^0 = 1.0 21 if (exponent == 0) 22 return 1.0; 23 // 0.0^exponent = 0.0 24 if ( (base - 0.0 > -0.0000001) && (base - 0.0 < 0.0000001) ) 25 return 0.0; 26 double result = PowerWithAbsExponent(base, abs(exponent)); 27 if (exponent < 0){ // 若exponent为负数,则结果取倒数 28 result = 1.0/result; 29 } 30 return result; 31 } 32 };