剑指offer--数值的整数次方

记录来自《剑指offer》上的算法题。

题目描述:

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

下面是一种解法:

// 判断num1是否等于num2
bool equal(double num1, double num2){if ((num1 - num2) > -0.0000001&& (num1 - num2) < 0.0000001)return true;elsereturn false;
}
// 求指数是正数的结果
double PowerWithUnsignedExponent(double base, unsigned int exponent){double result = 1.0;for (int i = 1; i <= exponent; i++)result *= base;return result;
}
double Power(double base, int exponent){g_InvalidInput = false;// 非法输入if (equal(base, 0.0) && exponent < 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;
}

上述解法中使用一个全局变量g_InvalidInput,用来判断是否输入非法的输入,如输入的基数是0,指数是负数,那么就是一个非法输入。这里判断两个小数是否相等,只能判断它们之差的绝对值是否小于某个数,而这也是上述解法中定义函数equal()的原因,用来判断输入的数是否为0。

上述解法中,函数PowerWithUnsignedExponent()还可以进一步进行优化,因为该函数的循环次数等于输入的指数减一,如输入指数是32,则循环中的乘法要做31次,采用下述公式对求a的n次方进行优化:

an={an/2an/2a(n1)/2a(n1)/2nn

其代码如下:

// 改进版本
double PowerWithUnsignedExponentOptimz(double base, unsigned int exponent){if (exponent == 0)return 0;if (exponent == 1)return base;double result = PowerWithUnsignedExponentOptimz(base, exponent >> 1);result *= result;if (exponent & 0x1 == 1)// 如果指数是奇数result *= base;return result;
}

这个代码是采用了递归方法来实现上述公式,同时采用位与运算代替求余运算(%)来判断一个数是否奇数还是偶数,这是因为位运算的效率比乘除法及求余运算的效率要更高。

测试例子可以查看我的Github。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jackson java网络接口_java~jackson实现接口的反序列化

jackson是springboot中集成的序列化方式&#xff0c;是默认的json序列化方式&#xff0c;当然你可以使用其它的序列化工具代替它&#xff0c;不过今天我们还是说一下它&#xff0c;使用jackson进行序列化一个类&#xff0c;然后再把它的JSON字符反序列化为它的接口对象。现实这…

剑指offer--打印1到最大的n位数

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 输入数字n&#xff0c;按顺序打印出从1到最大的n位十进制数。比如输入3&#xff0c;则打印出1&#xff0c;2&#xff0c;3一直到最大的3位数即999。 第一种解法是比较容易想到&#xff0c;但是遇到大数问题的时候会有…

java判断闰年通过多态方法_04748《Java语言程序设计》实验指导书.doc

04748《Java语言程序设计》实验指导书.docJava语言程序设计实验指导书前言一、上机实验目的上机实验的目的是提高学生的分析问题、解决问题的能力和动手能力&#xff0c;通过实践环节理解 Java语言的基本结构和程序设计方法。通过亲手编程掌握 Java 程序设计编程的方法。二、实…

利用宏定义在编译阶段检查结构体大小的方法

http://blog.csdn.net/crazycoder8848/article/details/8292770 typedef struct {char a[100]; } T_XXX;typedef struct {char a[99]; } T_QQQ;/* 检测结构体的大小是否等于特定值 */ #define SIZE_OF_TYPE_EQUAL_TO(type, size) \ static inline char size_of_##type##_eq…

剑指offer--在O(1)时间内删除链表结点

记录来自《剑指offer》上的算法题。 题目如下&#xff1a; 给定单向链表的头指针和一个结点指针&#xff0c;定义一个函数在O(1)时间删除该结点。 结点定义如下&#xff1a; struct ListNode{int m_nValue;ListNode* m_pNext; }; 最常规的删除链表结点方法是从头结点开始遍历…

Designer设计无代码工作流

1. 打开Designer&#xff0c;选择工作流&#xff0c;选择列表工作流&#xff0c;选择你要将此工作流应用的列表&#xff08;这里我选择报销单&#xff09;。 填写好工作流名称&#xff0c;点击确定。 现在我们开始正式设计工作流&#xff0c;首先我们拉一个记录历史到工作流中&…

剑指offer--调整数组顺序使奇数位于偶数前面

记录来自《剑指offer》的算法题。 题目如下&#xff1a; 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 最简单的思路就是从头开始扫描整个数组&#xff0c;当碰到偶…

java proguard 使用_使用proguard混淆java9代码

序本文主要研究一下如何使用proguard混淆java9代码mavencom.github.wvengenproguard-maven-pluginpackageproguard6.0.1${project.build.finalName}.jar${project.build.finalName}.jar!META-INF/maven/**,!module-info.classtrue${project.basedir}/proguard.cfg${java.home}/…

75个移动App开发教程

原文地址&#xff1a;http://www.goodfav.com/zh/app-development-tutorials-3559.html 移动应用程序开发是大企业和创意的个人和小团队开发&#xff0c;是一个有很多商业机会的领域之一。它可能需要多次尝试设计来实施一个出类拔萃的应用程序&#xff0c;但是&#xff0c;如果…

机器学习算法总结--线性回归和逻辑回归

1. 线性回归 简述 在统计学中&#xff0c;线性回归&#xff08;Linear Regression&#xff09;是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合&#xff08;自变量都…

java 对应sql驱动版本_关于Oracle JDBC驱动版本、JDK版本、数据库版本对应关系(相关的报错:ORA-28040)...

关于Oracle JDBC驱动版本、JDK版本、数据库版本对应关系说明&#xff1a;1、Oracle JDBC驱动版本查看方式(Oracle JDBC驱动程序随Oracle数据库服务器一起提供)(用户&#xff1a;Oracle”)&#xff1b;$cd $ORACLE_HOME/jdbc/libojdbc5.jarojdbc6.jar2、JDK版本查看方式&#xf…

Thinking in java之前

开始写博客了&#xff0c;从哪里开始呢&#xff0c;因为是抱着学习的态度开始写&#xff0c;所以选择用java开始。很多人说C语言是最适合入门的语言&#xff0c;不知道为什么&#xff0c;我却一直觉得java是入门语言首选。 java是简单的&#xff0c;健壮的&#xff0c;灵活的。…

C++知识总结(1)--变量和基本类型

最近打算看看《C primer》&#xff0c;重新复习C的一些知识点&#xff0c;同时会添加部分在做牛客网编程题目时候记录的知识点。 变量和基本类型 endl操纵符的效果是结束当前行&#xff0c;并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产…