面试题:数值的整数次方

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

分析:pow函数我们已经使用过很多次,对于其函数原型我们也很熟悉。

    double pow( double x, double y );

    很快我们就会写出如下的代码:

double MyPowerwithUnsigned(double base,int exp)
{
	double result=1.0;
	int i=0;
	for(i=1; i<=exp; i++)
	{
		result*=base;
	}
	return result;
}

可是,如果我们输入的指数是负数或者是零将会无法正确计算。说明上述代码还是存在很大的漏洞。对于这个问题我们需要分三种情况考虑,第一,输入指数是正整数;第二,输入指数是0;第三,输入指数是负整数。这样处理就能轻松应对了。

Note:注意浮点数与零值作比较的正确方式。不能直接用判断相等进行判断,需要给予一个精度进行比较。例如:if(x>=-EPSINON && x<=EPSINON)(EPSINON是精度)。

参考源代码:

#include<cstdio>
#include<cstdlib>

bool flag=false;

double MyPowerwithUnsigned(double base,unsigned int exp)
{
	double result=1.0;
	int i=0;
	for(i=1; i<=exp; i++)
	{
		result*=base;
	}
	return result;
}

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

double MyPower(double base,int exp)
{
	flag=false;
	if(equal(base,0.0) && exp < 0)
	{
		flag=true;
		return 0.0;
	}
	unsigned int absexp=(unsigned int)exp;
	if(exp<0)
	
		unsigned int absexp=(unsigned int)(-exp);
	
	double result=MyPowerwithUnsigned(base,absexp);
	if(exp<0)
	{
		result=1.0/result;
	}
	return result;
}

int main()
{
	double ret=MyPower(2.5,2);
	printf("%lf\n",ret);
	system("pause");
	return 0;
}


你可能感兴趣的:(面试题,整数,pow)