2018.8.7 《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门
一道经典的复现库函数pow的题目。
如果直接连乘效率会比较低,可以考虑利用
注意:1.几个边界条件:底数为0,指数为0,指数为负。2.判断double不能用底数base == 0.0,要写专门的函数equal来判断。
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
JAVA实现:
/**
*
* @author ChopinXBP
* 复现库函数pow:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
*
*/
public class MyPower {
public static void main(String[] args) {
// TODO Auto-generated method stub
double num = MyPow(3, 6);
System.out.println(num);
}
public static double MyPow(double base, int exponent) {
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
} else if (exponent == 0) {
return 1.0;
} else if (exponent == 1) {
return base;
}
// 优化方式:用exponent >> 1代替exponent/2,用(exponent & 0x1) == 0代替exponent%2 == 0
if ((exponent & 0x1) == 0) {
return MyPow(base, exponent >> 1) * MyPow(base, exponent >> 1);
} else if ((exponent & 0x1) == 1) {
return base * MyPow(base, exponent >> 1) * MyPow(base, exponent >> 1);
}
return -1; // 边界base为0,返回-1
}
// 注意考虑边界base为0,判断double不能用base == 0.0,要写专门的函数equal来判断
public static boolean equal(double num1, double num2) {
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
}
C++实现参考:
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if((exponent & 0x1) == 1)
result *= base;
return result;
}
测试代码:
// ====================测试代码====================
void Test(double base, int exponent, double expectedResult, bool expectedFlag)
{
double result = Power(base, exponent);
if(abs(result - expectedResult) < 0.00000001
&& g_InvalidInput == expectedFlag)
printf("Test passed.\n");
else
printf("Test failed.\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
// 底数、指数都为正数
printf("Test1 begins.\n");
Test(2, 3, 8, false);
// 底数为负数、指数为正数
printf("Test2 begins.\n");
Test(-2, 3, -8, false);
// 指数为负数
printf("Test3 begins.\n");
Test(2, -3, 0.125, false);
// 指数为0
printf("Test4 begins.\n");
Test(2, 0, 1, false);
// 底数、指数都为0
printf("Test5 begins.\n");
Test(0, 0, 1, false);
// 底数为0、指数为正数
printf("Test6 begins.\n");
Test(0, 4, 0, false);
// 底数为0、指数为负数
printf("Test7 begins.\n");
Test(0, -4, 0, true);
return 0;
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#