11_Power_powerunsignedexponent-程序员宅基地

技术标签: 《剑指Offer》  

代码和详细注释如下:

#include<iostream>
#include<math.h>
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的话,那么这个时候可能会出现1/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;
}

/*
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
double result = 1.0;
/
for(int i = 1; i <= exponent; ++i)
result *= base;

return result;
}
*/
double PowerWithUnsignedExponent(double base, unsigned int exponent)//这里使用了一个公式来处理
{
	if (exponent == 0)//指数为0的情况
		return 1;
	if (exponent == 1)//指数为1的情况
		return base;

	double result = PowerWithUnsignedExponent(base, exponent >> 1);
	result *= result;
	if ((exponent & 0x1) == 1)
		result *= base;

	return result;
}

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

// ====================测试代码====================
void Test(double base, int exponent, double expectedResult, bool expectedFlag)
{
	double result = Power(base, exponent);
	if (abs(result - expectedResult) < 0.00000001
		&& g_InvalidInput == expectedFlag)
		printf("Test passed.\n");
	else
		printf("Test failed.\n");
}

int main()
{
	// 底数、指数都为正数
	printf("Test1 begins.\n");
	Test(2, 3, 8, false);

	// 底数为负数、指数为正数
	printf("Test2 begins.\n");
	Test(-2, 3, -8, false);

	// 指数为负数
	printf("Test3 begins.\n");
	Test(2, -3, 0.125, false);

	// 指数为0
	printf("Test4 begins.\n");
	Test(2, 0, 1, false);

	// 底数、指数都为0
	printf("Test5 begins.\n");
	Test(0, 0, 1, false);

	// 底数为0、指数为正数
	printf("Test6 begins.\n");
	Test(0, 4, 0, false);

	// 底数为0、指数为负数
	printf("Test7 begins.\n");
	Test(0, -4, 0, true);

	return 0;
}


代码中提到的公式的意思就是上面两个截图中的公式,公式的意思是,例如

连续两个2^5相乘就是2^10

没必要费劲儿去循环10次了,5+1次即可。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/appleyuchi/article/details/80962695

智能推荐

UVA 10574 - Counting Rectangles 计数-程序员宅基地

文章浏览阅读62次。Given n points on the XY plane, count how many regular rectangles are formed. A rectangle is regular if and only if its sides are all parallel to the axis.InputThe first line contains the number of tes..._rectangle 计数

小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载六-设计播放器APP_音乐播放器插件 jquery mobile-程序员宅基地

文章浏览阅读2k次。用jquery Mobile可以创建几乎所有的APP。虾米音乐很有意思吧?本节连载来看看如果做一个虾米音乐播放器!_音乐播放器插件 jquery mobile

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):-程序员宅基地

文章浏览阅读157次。三种情况:1. mapper的namespace写的不对!!!注意系修改。2.UserDao的方法在UserDao.xml中没有,然后执行UserDao的方法会报此3. UserDao的方法返回值是List,而select元素没有正确配置ResultMap,或者只配置ResultType!4. 如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行,保存.问题解决...我的属于第..._org.apache.ibatis.binding.bindingexception: invalid bound statement (not found):

NOIP,CSP-J,CSP-S——高精度加减乘除-程序员宅基地

文章浏览阅读649次,点赞21次,收藏11次。int的范围,正负上下限大约为2.1*10^9;long long的范围,正负上下限大约为9.2*10^18;处理19位以上的数字,对它们进行加减乘除

AcWing 1432. 棋盘挑战(DFS回溯+n皇后问题变形)_回溯法给你一个n* n的棋盘,你要在棋盘中放- -些棋子,每行每列每一条对角线最 多有一个棋子,由多-程序员宅基地

文章浏览阅读136次。题目链接给定一个 N×N 的棋盘,请你在上面放置 N 个棋子,要求满足:每行每列都恰好有一个棋子每条对角线上都最多只能有一个棋子 1 2 3 4 5 6 -------------------------1 | | O | | | | | -------------------------2 | | | | O | | | -------------------------3 | | | | | _回溯法给你一个n* n的棋盘,你要在棋盘中放- -些棋子,每行每列每一条对角线最 多有一个棋子,由多少种方法。

我的UVa & BZOJ_bzoj账号-程序员宅基地

文章浏览阅读2.1k次。我的UVa账号名为Fuxey , 因为前期的程序没有时间写入博客 , 以后会慢慢补充上来 , 大家可以在Uhunt中查找我已经通过的题目 ,如果你对我的做法感兴趣我可以发给你我的代码 , 但可能有部分源代码已经丢失 。 UVa上的通过的题目是紫书(刘汝佳的入门经典)的几乎所有题目 ,目前训练指南的题目没有全部覆盖(博主正在努力中) , 博主计划做一个刘汝佳题解全覆盖的博客 ,如果你有更好的_bzoj账号

随便推点

eclipse java.io_Eclipse IDE中的java.io.Console支持-程序员宅基地

文章浏览阅读187次。Eclipse IDE中的java.io.Console支持我使用Eclipse IDE来开发,编译和运行我的Java项目。 今天,我正在尝试使用System.console()类来管理输出,更重要的是,用户输入。问题是System.console()在“通过”Eclipse运行应用程序时返回null。 Eclipse在后台进程上运行程序,而不是我们熟悉的控制台窗口的顶级进程。有没有办法强制Ecl..._eclipse java console

使用docker下载并安装mongodb5.0.5_docker中安装mongodb5-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏5次。1.安装docker和docker-compose1.1 安装docker软件yum install -y docker1.2 启动docker并将docker加入开机启动systemctl start dockersystemctl enable docker1.3 查看docker版本docker version1.4 安装docker-compose安装epel源yum install -y epel-release安装docker-composeyum i..._docker中安装mongodb5

linux设备树语法-程序员宅基地

文章浏览阅读351次。设备树语法及绑定概述Device Tree是一种用来描述硬件的数据结构,类似板级描述语言,起源于OpenFirmware(OF)。就ARM平台来说,设备树文件存放在arch/arm/boot/dts下,绑定文档存在Documentation/devicetree/bindings下。设备树由一系列被命名的节点(node)和属性(property)组成,而节点本身可包含子节点。所谓属..._warning: dt compatible string

Python批量调整Word文档中的字体、段落间距及格式python调用函数批量调整word格式_python进行word文档编辑 times new roman-程序员宅基地

文章浏览阅读7.3k次,点赞12次,收藏74次。利用Python定义函数批量处理Word中的字体格式样式,间距行距、字体设置。_python进行word文档编辑 times new roman

单片机原理及应用以及单机片的主要分类-程序员宅基地

文章浏览阅读1.2k次。导读:现代单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、等等,这些都离不开单片机。在单片机入门系列讲座中,首先学习单片机的基本构成和工作原理、以及外围功能电路,然后,挑战一个_单片机原理及应用

表单式工作流功能模块设计方案-程序员宅基地

文章浏览阅读9.7k次,点赞34次,收藏33次。最近一个项目中需要独自设计一个表单式工作流功能模块,在此将整个功能模块的设计思路分享出来。_功能模块设计

推荐文章

热门文章

相关标签