剑指offer16:数值的整数次方

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

        一、第一种方法
        大体分为以下四种情况:
    (1)底数为0,则返回0;
    (2)底数不为0,若指数为0,则返回1;
    (3)底数不为0,若指数为正数,调用Powerresult函数计算结果;
    (4)底数不为0,若指数为负数,取指数的绝对值,调用Powerresult函数计算结果,将此结果取倒数。

    具体代码如下所示:

#include <stdio.h>

double Powerresult(double base,int exponent)
{
	double result=1.0;
	for(int i = 1;i <= exponent;++i)
	{
		result*=base;
	}
	return result;
}


double Power(double base,int exponent)
{
	double result;
	if(base == 0)  //底数为0
	{
		return 0.0;
	}
	else  //底数不为0
	{
		if(exponent == 0)  //指数为0
		{
			return 1.0;
		}
		else if(exponent > 0)  //指数为正数
		{
			result=Powerresult(base,exponent);
		}
		else  //指数为负数
		{
			result=Powerresult(base,-1*exponent);
			result=1.0/result;
		}
	}
	return result;
}

int main()
{
	printf("%f\n",Power(0,0));
	printf("%f\n",Power(0,1));
	printf("%f\n",Power(0,-1));
	printf("%f\n",Power(2,0));
	printf("%f\n",Power(2,3));
	printf("%f\n",Power(-3,3));
	printf("%f\n",Power(-3,2));
	printf("%f\n",Power(3,2));
	printf("%f\n",Power(2,-4));
	printf("%f\n",Power(2,-3));
	return 0;
}

运行结果如下:
 

        二、第二种方法
        采用递归的思路,例如求一个数的32次方,如果已经知道了它的16次方,那么只要在16次方的基础上在平方一次可以了,而16次方是8次方的平方,这样以此类推,求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。
        可用如下公式求a的n次方:

    具体代码如下所示:

#include <stdio.h>

double Power(double base,int exponent)
{
	if(exponent == 0)
	{
		return 1;
	}
	if(exponent == 1)
	{
		return base;
	}

	double result=1.0;
	result=Power(base,exponent/2);
	result*=result;
	if(exponent & 0x1 == 1) //判断指数是否为奇数
	{
		if(exponent > 0)
		{
			result*=base;
		}
		else
		{
			result*=(1.0/base);
		}
	}
	return result;
}

int main()
{
	printf("%f\n",Power(0,0));
	printf("%f\n",Power(0,1));
	printf("%f\n",Power(0,-1));
	printf("%f\n",Power(2,0));
	printf("%f\n",Power(2,3));
	printf("%f\n",Power(-3,3));
	printf("%f\n",Power(-3,2));
	printf("%f\n",Power(3,2));
	printf("%f\n",Power(2,-4));
	printf("%f\n",Power(2,-3));
	return 0;
}

 运行结果如下所示:

        在上面的代码中,用位与运算符代替了求余运算符(%)来判断指数是奇数还是偶数,位运算的效率比乘除法及求余运算的效率要高很多。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值