剑指offer:数值的整数次方
题目:实现函数double Power(double base, int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
![]()
比较简单的代码:
double Power(double base, double exponent){double result=1.0;for(int i=1; i<=exponent; ++i){result*=base;}return result;}
这个没有考虑到指数小于1的时候。
使用如下的代码,这个用一个全局变量来标示。
double Power(double base, int exponent){g_InvalidInput = false;if(equal(base, 0.0) && exponent < 0){g_InvalidInput = true;return 0.0;}unsigned int absExponent = (unsigned int)(exponent);if(exponent < 0)absExponent = (unsigned int)(-exponent);double result = PowerWithUnsignedExponent(base, absExponent);if(exponent < 0)result = 1.0 / result;return result;}double PowerWithUnsignedExponent(double base, unsigned int exponent){double result = 1.0;/for(int i = 1; i <= exponent; ++i)result *= base;return result;}bool equal(double num1, double num2){if((num1 - num2 > -0.0000001)&& (num1 - num2 < 0.0000001))return true;elsereturn false;}
由于计算机表示小数都有误差因此不能用==来判断两个小数是否相等。如果两者差值很小,则认为相等。
用以下的方法实现会更好一些。
下图这个公式:

使用递归的方式来实现。
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;}
浙公网安备 33010602011771号