面试题11:数值的整数次方的计算

本文介绍了一种不依赖库函数的幂运算实现方法,通过循环相乘法和类似二分查找的思想来高效计算底数的指数次幂。讨论了如何处理特殊情况如0的幂和负指数,并提供了一个示例程序。

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

1.在不用库函数的情况下,实现函数 double Power(double base,double exponent),就是求base的exponent次方。

分析:

要考虑全面,可能出现的异常情况,例如当指数为负数,底数为0的情况,相当于是除以0,出产生异常,当底数为负数的时候,应该是先取绝对值,最后再求导数。

通常的做法是循环相乘法,但是这种效率并不是最高的,可以借用二分查找里面的思想,递归的计算2/exponent次方的值,再求平方,这样可以减少计算量。

源码:

/*  */
#include<iostream>
#include <math.h>
#include <time.h>
using namespace std;


//#define ONE
#define TWO
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)//除数是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;
}

#ifdef ONE
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
	double result = 1.0;

	for (int i = 1; i <= exponent; ++i)//循环相乘法
		result *= base;

	return result;
}

#elif defined TWO

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

#endif
bool equal(double num1, double num2)//浮点数比较是否为0
{
	if ((num1 - num2 > -0.0000001)
		&& (num1 - num2 < 0.0000001))
		return true;
	else
		return false;
}


int main()
{
	double result = 0;

	result = Power(7, 7);//一般情况
	cout << "the result is :" << result << endl;

	result = Power(0, 7);//0的处理
	cout << "the result is :" << result << endl;

	result = Power(0, -3);//除数为0的处理
	cout << "the result is :" << result << endl;
	system("PAUSE");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值