16 数值的整数次方

题目

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

牛客网 OJ
AcWing OJ

C++ 题解

  • 当指数为负数的时候:可以先对指数求绝对值,然后算出次方的结果之后再取倒数。
  • 当底数(base)是零且指数是负数的时候:通过全局代码或异常告诉调用者参数有误。
  • 0的0次方的时候:由于0的0次方在数学上是没有意义的,因此无论是输出0还是1都是可以接受的。

比如,我们求n的32次方,我们先知道n 的16次方,在16次方的基础上再平方就可以,同理,我们可以先求8次方,4次方,2次方,因此我们求32次方就变成了先求平方,在此基础上求4次方,再求8次方,再求16次方,最后就可以求得32次方。
我们提出如下的公式:

\[{a^n} = \left\{ \begin{array}{l} {a^{\frac{n}{2}}}{a^{\frac{n}{2}}}\;\;\;\;\;\;\;\;\;\;\;\;\;n/2\; = = \;0\\ {a^{\frac{{n - 1}}{2}}}{a^{\frac{{n - 1}}{2}}}a\;\;\;\;\;\;n/{\rm{2}}\;{\rm{ = = 1}} \end{array} \right. \]

bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);

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)
{
	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;
}

bool equal(double num1, double num2)
{
	if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
		return true;
	else
		return false;
}

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.g_InvalidInput=False
    def Power(self, base, exponent):
        # write code here
        if base==0.0 and exponent<0:
            self.g_InvalidInput=True
            return 0.0
        if exponent>=0:
            return self.PowerWithUnsignedExponent2(base,exponent)
        return 1.0/self.PowerWithUnsignedExponent2(base,-exponent)

    def PowerWithUnsignedExponent2(self, base, exponent):
        if exponent==0:
            return 1
        if exponent==1:
            return base
        res=self.PowerWithUnsignedExponent2(base,exponent>>1)
        res *= res
        if exponent & 0x1==1:
            res*=base
        return res
posted @ 2019-01-29 15:07  youngliu91  阅读(243)  评论(0)    收藏  举报