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

本文深入探讨了如何在不使用库函数的情况下实现高效幂运算,采用递归算法结合位运算,将时间复杂度降低到O(logn)。文章详细解释了正数、负数和零指数情况下的幂运算实现,并提供了代码示例和测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目;

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

二、代码分析:

2.1 全局变量g_InvaildInput标识是否出错,出错时为true
bool g_InvaildInput=false;
2.2高效求值的公式 时间复杂度为o(logn)
n为偶数 a^n =a^n/2*a^n/2
n为奇数 a^n=a^(n-1)/2*a^(n-1)/2*a
2.3 base的exponent次方,此时,base>0且exponent>0

位运算的效率比乘除法及求余运算的效率高, 用右移运算符代替了除以2 用位与运算符代替了求余运算符来判断是否为奇数

 double PowerWithUnsignedExponent(double base,unsigned int exponent)
    {
    	//任何数的0次方都为1  由于0的0次方无意义,所以返回0,1均可
    	if(exponent==0)
    		return 1;
    	//任何数的1次方都是自己本身
    	if(exponent==1)
    		return base;
    	
    	//使用递归函数,用右移运算符代替了除以2  位运算的效率比乘除法及求余运算的效率高
    	double result=PowerWithUnsignedExponent(base,exponent>>1);
    	result*=result;
    	//用位与运算符代替了求余运算符来判断是否为奇数
    	if((exponent & 0x1)==1)
    		result*=base;
    
    	return result;
    }
2.4 判断两个浮点数的值相等
  bool equal(double num1,double num2)
    {
    	if(num1-num2>=-0.0001&&(num1-num2<=0.0001))
    	{
    		return true;
    	}
    	return false;
    }
2.5 base的exponent次方 注意base为0或者exponent<1的情况
double Power(double base,int exponent)
{
	g_InvaildInput=false;
	//若base为0且指数小于0  
	if(equal(base,0.0)&&exponent<0) 
	{
		g_InvaildInput=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;
}

三、代码测试及结果

3.1测试代码

int main()
{
printf("%2f\n",Power(6,2));
printf("%2f\n",Power(2,-1));
printf("%2f\n",Power(0,2));
return 0;
}
3.2测试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值