牛客网&剑指Offer&数值的整数次方![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e99ab68c84b4ff688488518853d4a9c5.jpeg)
另外,此题不需要考虑大数问题。
代码实现1
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
bool errinput = false;
bool Equal(double num1, double num2)
{
if((num1 - num2 < 0.0000001) && (num1 - num2 > -0.0000001))
return true;
else
return false;
}
class Solution {
public:
double Power(double base, int exponent) {
double result = 1.0;
if (Equal(base,0.0) && exponent < 0)
{
errinput = true;
return 0;
}
if (exponent >= 0)
{
for (int i = 0; i < exponent; i++)
{
result = result * base;
}
return result;
}
else
{
for (int i = 0; i < -exponent; i++)
{
result = result * base;
}
return 1 / result;
}
}
};
int main()
{
double result = 0.0;
double base_value = 0.0;
int exponent_value = -3.0;
Solution test;
result = test.Power(base_value, exponent_value);
cout << result << endl;
cout << errinput << endl;
return 0;
}
代码实现2
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
bool negativeflag = false;
bool errinput = false;
bool Equal(double num1, double num2)
{
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
double PowerWithUnsignedExponent(double base, int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
if (exponent < 0)
{
if (Equal(base, 0.0))
{
errinput = true;
return 0;
}
else
{
exponent = -exponent;
negativeflag = true;
}
}
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if ((exponent & 0x1) == 1)
result *= base;
if(negativeflag == 0)
return result;
else
return 1/result;
}
int main()
{
double result = 0.0;
double base_value = 2.0;
int exponent_value = -3;
result = PowerWithUnsignedExponent(base_value, exponent_value);
cout << result << endl;
return 0;
}
编程笔记
- 代码实现解题思路:根据题意列出算式即可,但是必须考虑多种情况。另外,还需要考虑分母不能为0的情况,当分母为0时,返回值为0,为了区分是出错返回0还是底数为0的时候正常运行返回的0,定义了一个全局变量。
- 由于精度问题,不能用"=="判断两个小数是否相等,如果两个小数的差的绝对值很小,如小于0.0000001,就可以认为它们相等,如下面函数:
bool Equal(double num1, double num2)
{
if((num1 - num2 < 0.0000001) && (num1 - num2 > -0.0000001))
return true;
else
return false;
}
- 可以用右移运算符代替整数除以2,用位与运算符代替求余运算符来判断一个数是奇数还是偶数,位运算的效率要比乘除法及求余运算符的效率高上很多。