题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方
考察点
- 代码的完整性(写出来容易做细致难)
- 对库函数的理解(库函数中pow函数用以实现乘方)
解题思路
- 很容易想到对base进行exponent次相乘,构造如下函数:
double Power(double base, int exponent)
{
double result = 1;
for (int i = 1; i <= exponent; i++)
result = result * base;
return result;
}
但很快你会发现当exponent为负数时,循环就无法进行了。
- 于是,考虑上exponent为负、正、0三种情况:
double Power(double base, int exponent)
{
double result = 1;
if (exponent == 0) return 1;
if (exponent > 0)
{
for (int i = 1; i <= exponent; i++)
{
result = result * base;
}
}
if (exponent < 0)
{
for (int i = 1; i <= abs(exponent); i++)
{
result = result * (1 / base);
}
}
return result;
}
- 很不幸,当base=0,exponent为负数时是没有意义的,也需要考虑进去。于是再上面加入:
if (base == 0) return 0;
进行异常抛出。 - 当全面考虑清楚后,发现循环次数较多,改递归进行简化:
double Power(double base, int exponent)
{
double result = 1;
if (base == 0) return 0;
if (exponent == 0) return 1;
if (exponent > 0)
{
if (exponent == 1) return base;
if (exponent & 0x1 == 1)//奇数
return Power(base, (exponent - 1) >> 1)*Power(base, (exponent - 1) >> 1)*base;
else
return Power(base, exponent >> 1)*Power(base, exponent >> 1);
}
if (exponent < 0)
return 1 / Power(base, -exponent);
}
完整代码
/*12-实现数值的正数次方*/
#include<iostream>
using namespace std;
class Solution {
public:
//考虑了exponent为正、负和0三种情况
double Power2(double base, int exponent)
{
double result = 1;
if (base == 0) return 0; //考虑了base = 0, exponent为负的情况
if (exponent == 0) return 1;
if (exponent > 0)
{
for (int i = 1; i <= exponent; i++)
{
result = result * base;
}
}
if (exponent < 0)
{
for (int i = 1; i <= abs(exponent); i++)
{
result = result * (1 / base);
}
}
return result;
}
//优化循环——>改递归
double Power(double base, int exponent)
{
double result = 1;
if (base == 0) return 0;
if (exponent == 0) return 1;
if (exponent > 0)
{
if (exponent == 1) return base;
if (exponent & 0x1 == 1)//奇数
return Power(base, (exponent - 1) >> 1)*Power(base, (exponent - 1) >> 1)*base;
else
return Power(base, exponent >> 1)*Power(base, exponent >> 1);
}
if (exponent < 0)
return 1 / Power(base, -exponent);
}
};
int main()
{
Solution s;
cout << s.Power(0, 2) << endl;
cout << s.Power(2, 2) << endl;
cout << s.Power(2, -3) << endl;
return 0;
}
编程
- 负数变正数:
直接前面加-
号;
使用绝对值函数abs()
。 - 奇偶判定:
奇数:n&1==1
;
偶数:n&1==0
。
使用位与操作代替取余%
- 乘除:
乘以2:左移一位<<1
;乘以4:左移两位<<2
除以2:右移一位>>1
;除以4:右移两位>>2
。