剑指offer:数值的整数次方

题目:实现函数double Power(double base, int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

比较简单的代码:
  1. double Power(double base, double exponent)
  2. {
  3. double result=1.0;
  4. for(int i=1; i<=exponent; ++i)
  5. {
  6. result*=base;
  7. }
  8. return result;
  9. }
这个没有考虑到指数小于1的时候。

使用如下的代码,这个用一个全局变量来标示。
  1. double Power(double base, int exponent)
  2. {
  3. g_InvalidInput = false;
  4. if(equal(base, 0.0) && exponent < 0)
  5. {
  6. g_InvalidInput = true;
  7. return 0.0;
  8. }
  9. unsigned int absExponent = (unsigned int)(exponent);
  10. if(exponent < 0)
  11. absExponent = (unsigned int)(-exponent);
  12. double result = PowerWithUnsignedExponent(base, absExponent);
  13. if(exponent < 0)
  14. result = 1.0 / result;
  15. return result;
  16. }
  17. double PowerWithUnsignedExponent(double base, unsigned int exponent)
  18. {
  19. double result = 1.0;
  20. /
  21. for(int i = 1; i <= exponent; ++i)
  22. result *= base;
  23. return result;
  24. }
  25. bool equal(double num1, double num2)
  26. {
  27. if((num1 - num2 > -0.0000001)
  28. && (num1 - num2 < 0.0000001))
  29. return true;
  30. else
  31. return false;
  32. }



由于计算机表示小数都有误差因此不能用==来判断两个小数是否相等。如果两者差值很小,则认为相等。

用以下的方法实现会更好一些。
下图这个公式:

使用递归的方式来实现。
  1. double PowerWithUnsignedExponent(double base, unsigned int exponent)
  2. {
  3. if(exponent == 0)
  4. return 1;
  5. if(exponent == 1)
  6. return base;
  7. double result = PowerWithUnsignedExponent(base, exponent >> 1);
  8. result *= result;
  9. if((exponent & 0x1) == 1)
  10. result *= base;
  11. return result;
  12. }


















原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4665205.html