《剑指offer》 数值的整数次方
本题来自《剑指offer》 数值的整数次方
题目:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:
代码从三个方面处理错误的代码,返回值,全局代码和异常。
我们考虑exponent是{负数,0,正数}和base有可能的取值{自然数,0}
首先考虑边界:如果base是0,则取值没有意义。exponent是0,则返回值为1。
如果exponent是负数,则返回其倒数即可。
如果exponent是正数,则直接返回。
处理函数可以采用循环的方式,为O(n),如果采用递归的方式为log(n)。
C++ Code:
class Solution { public: double Power(double base, int exponent) { if (equal(base,0.0) && exponent < 0){ return 0; } unsigned int absexponent = (unsigned int)(exponent); if (exponent < 0){ absexponent = (unsigned int)(-exponent); } double result = PowerDeal(base,absexponent); if (exponent < 0){ result = 1.0 / result; } return result; } bool equal(double num1,double num2){ if ((num1 - num2 > -0.0000001) && (num1-num2<0.0000001)){ return true; }else{ return false; } } double PowerDeal(double base,unsigned int exponent){ double result = 1.0; for (int i = 1;i<=exponent;i++){ result *= base; } return result; } };
Python Code:
# -*- coding:utf-8 -*- class Solution: def Power(self, base, exponent): # write code here if base == 0 and exponent <= 0: #考虑边界,当base为0并且指数小于0,便没有意义 return 0 absexponent = abs(exponent) #求绝对值 result = self.PowerDeal(base,absexponent) #只求正数的指数 if exponent == 0: #如果指数为0,则结果为1 return 1 elif exponent < 0: #如果指数为负数,则结果是正数的倒数 result = 1 / result return result def PowerDeal(self,base,exponent): #采用循环的思路是O(n) result = 1.0 for i in range(exponent): result *= base return result def IterPowerDeal(self,base,exponent): #采用递归的思路,将是logn if base == 0: return 1 if base == 1: return base result = self.IterPowerDeal(base,exponent//2) result *= result if exponent & 0x1 == 1: result *= base return result
总结:
要考虑边界条件,异常处理,正常的逻辑功能。