剑指offer 面试题(数值的整数次方)(5)

#  面试题:数值的整数次方


/*

题目: 实现函数 double Power(double base, int exponcent).


求base 的exponcent 次方。不得使用库函数,同时不需要考虑大数问题。

*/


题目分析:
          
    乍一看,这不就是我们经常用的 pow 函数嘛!  那还不简单,于是大家立马就能写出下面这个函数(递归也可以)

double Power(double base, int exponcent)
{
	int i = 0;
	double ret = 1.0;//注意返回值类型;

	for(i = 0; i < exponcent ; i++)
	{
		ret *= base ;  
	}
	return ret;
}


@   是不是和你现在想的一样, 先别高兴太早!  你输入个负数试试看!   0 次方是不是也没考虑!   懵逼了吧! 那就

静下来好好将各种情况处理;

@  强调两点: 第一点,注意double类型数据的误差; 第二点: 指数为负数的次方,应该将 取指数的绝对值求值,

然后取倒数输出;

考虑较为全面的算法如下:


double PowerMeans(double base,unsigned int exponcent)//Power的实现手段函数
{
	int i =0;
	double ret = 1;
    for(i = 0; i < exponcent ; i++)
	{
		ret = base*ret;
	}
	return ret;
}

double Power(double base, int exponcent)
{
	double ret = 1.0;
	unsigned int abs = 0;
	/*
	注意double类型的误差分析; 
	*/
	if((base - 0.0)> -0.0000001 && (base - 0.0) < 0.0000001&& exponcent < 0)
		return 0.0;

	abs = (unsigned  int)(exponcent );

	if(exponcent < 0)//指数为负数的情况;
		abs = (unsigned  int)(-exponcent );
	
	ret = PowerMeans (base,abs);
	
	if(exponcent < 0)
		ret = 1.0/ret;//取倒数;
	return ret;
}

#  是不是感觉看着全面多了,   可是,如果你碰到的面试官是个对效率要求比较高的人,那么,   他肯定会提醒你看

看PowerMeans 函数还可不可以优化!

那么,问题就来了,  怎么可以更快呢!  仔细看, 如果求 2^32  是不是可以先把2^16 求出来相乘,以此类推,总共

需要做5次乘法;

@ 注意 ;  如果指数是奇数,那么最后还得乘一次 base; 以 2^31次方类比一下就可以得出;

我们用递归实现PowerMeans 函数:


double PowerMeans(double base, int exponcent)
{
	double ret = 1.0;

	if(exponcent == 0)
		return 0;
	if(exponcent == 1)
		return base;
	ret = PowerMeans (base,exponcent >> 1);
	ret *= ret;
	if((exponcent & 1) == 1)//判断指数的奇偶性;
		ret *= base;
	return ret;
}


Ps :  不动起来,你永远不知道自己有多棒!

over!

Thank!

你可能感兴趣的:(函数,面试题,博客,C语言)