剑指offer题目12:数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

解答思路

其实没有什么难点,主要是想好各种出现的情况

  1. 底数为0的时候,计算没有意义的,和面试官确定好返回直接0就可以了
  2. 指数为0的时候,直接返回1
  3. 指数为负数的时候,需要变成倒数返回。

想好之后很容易写出,算法时间复杂度是O(n)

for(int i = 0; i < exponent; ++i) {
    res *= base;
}

但可以实现优化成如下样子,这样就可以变成O(log2n):

实现代码

class Solution {
public:
    double Power(double base, int exponent) {
    	// 底数为0 就直接返回0
    	if(Equal(base, 0.0)) {
    		return 0;
    	} 

    	// 指数为0的话就是1
    	if(exponent == 0) {
    		return 1;
    	}

    	// 判断指数是否为负数
    	int exponentTemp = exponent;
    	if (exponent < 0)
    	{
    		exponentTemp = 0 - exponentTemp;
    	}

    	// 判断指数是否为偶数
    	int mod = exponentTemp % 2;
    	if(mod == 1) {
    		exponentTemp -= 1;
    	}

    	// 计算结果
    	double res = base;
    	for (int i = 2; i <= exponentTemp; i = i << 1)
    	{
    		res *= res;
    	}

    	// 如果是奇数则再乘底数
    	if(mod == 1 && exponent != 1) {
			res *= base;    		
    	}

    	// 指数为负数则变成倒数
    	if(exponent < 0) {
    		res = 1 / res;
    	}

    	return res;
    }

    bool Equal(double num1, double num2) {
    	if(num1 - num2 < 0.0000001 && num1 - num2 > -0.0000001) {
    		return true;
    	} else {
    		return false;
    	}
    }
};
posted @ 2019-03-29 09:38  {-)大傻逼  阅读(147)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。