《剑指offer》第十六题(数值的整数次方)
// 面试题:数值的整数次方
// 题目:实现函数double Power(double base, int exponent),求base的exponent
// 次方。不得使用库函数,同时不需要考虑大数问题。 #include <iostream>
#include <cmath>
using namespace std; 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同时改变g_InvalidInput,后面判断为啥为0时候,这个变量会告诉我们是base=0且指数为负的错误
{
g_InvalidInput = true;
return 0.0;//第一种情况:base=0
} unsigned int absExponent = (unsigned int)(exponent);
if (exponent < )
absExponent = (unsigned int)(-exponent);//如果不再加负号,absExponent会变成exponent的补数 double result = PowerWithUnsignedExponent(base, absExponent);
if (exponent < )
result = 1.0 / result;//第二种情况:absExponent<0
//第三种情况:absExponent>=0
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)//计算base不为0,exponent为非负数情况下的幂值
{
if (exponent == )
return ;
if (exponent == )
return base; double result = PowerWithUnsignedExponent(base, exponent >> );//使用右移作为除2操作,会很快,exponent为正,所以不怕右移
result *= result;
if ((exponent & 0x1) == )//使用与操作判断是否是奇数,也是一种加速优化操作
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(const char* testName, double base, int exponent, double expectedResult, bool expectedFlag)
{
double result = Power(base, exponent);
if (equal(result, expectedResult) && g_InvalidInput == expectedFlag)
std::cout << testName << " passed" << std::endl;
else
std::cout << testName << " FAILED" << std::endl;
} int main(int argc, char* argv[])
{
// 底数、指数都为正数
Test("Test1", , , , false); // 底数为负数、指数为正数
Test("Test2", -, , -, false); // 指数为负数
Test("Test3", , -, 0.125, false); // 指数为0
Test("Test4", , , , false); // 底数、指数都为0
Test("Test5", , , , false); // 底数为0、指数为正数
Test("Test6", , , , false); // 底数为0、指数为负数
Test("Test7", , -, , true);
system("pause");
return ;
}
《剑指offer》第十六题(数值的整数次方)的更多相关文章
- 【校招面试 之 剑指offer】第16题 数值的整数次方
方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况. #include<iostream> using namespace std; template<typ ...
- 剑指Offer面试题:10.数值的整数次方
一.题目:数值的整数次方 题目:实现函数double Power(doublebase, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 在.N ...
- 剑指offer——面试题16:数值的整数次方
// 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...
- 【剑指offer】面试题 16. 数值的整数次方
面试题 16. 数值的整数次方 题目描述 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解答过程 下面的讨论中 x 代表 bas ...
- 《剑指offer》面试题16. 数值的整数次方
问题描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入: 2.0 ...
- 剑指offer 12.代码的完整性 数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 本人渣渣代码: public double Power(double ba ...
- 剑指Offer(书):数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 分析: * 要注意以下几点:* 1.幂为负数时,base不能为0,不然求的时候是对 ...
- 《剑指offer》面试题11 数值的整数次方 Java版
书中方法:这道题要注意底数为0的情况.double类型的相等判断.乘方的递归算法. public double power(double base, int exponent){ //指数为0 if( ...
- 《剑指offer》第六题(重要!从尾到头打印链表)
文件main.cpp // 从尾到头打印链表 // 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. #include <iostream> #include <sta ...
- 剑指offer五十六之删除链表中重复的结点
一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
随机推荐
- MySQL从删库到跑路_高级(四)——存储过程
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.存储过程简介 1.存储过程简介 存储过程是一组具有特定功能的SQl语句集组成的可编程的函数,经编译创建并保存在数 ...
- 了解SpringBoot
一.SpringBoot是什么? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...
- IO(基础知识)
IO流类的构造方法决定是输入流还是输出流.输入流连接一个文件,它会将文件中的内容读到流里面,read方法是将流里面的内容 往外读.输出流连接一个文件,它的write方法,是将内存中的内 ...
- node.js cookie session使用教程
众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢? cookie 首先产生了 cookie 这门技术来 ...
- tomcat性能调优 大赞
从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü 吞吐量 ü Responsetime ü Cpuload ü MemoryUsage 我 们也在第三天的学习中对Apa ...
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数. Google2009华南地 ...
- 开源|如何使用CNN将视频从2D到3D进行自动转换(附源代码)
http://www.sohu.com/a/128924237_642762 全球人工智能 文章来源:GitHub 作者:Eric Junyuan Xie 它是如何运行的? 在运行代码之前,请先根据官 ...
- 07: linux中正则表达式与grep使用
1.1 linux中正则表达式 1.^linux 以linux开头的行 2.$php 以php结尾的行 3.. 匹配任意单字符 4..+ ...
- 20145314郑凯杰《网络对抗技术》实验9 web安全基础实践
20145314郑凯杰<网络对抗技术>实验9 web安全基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET ...
- 20145335郝昊《网络攻防》Exp4 Adobe阅读器漏洞攻击
20145335郝昊<网络攻防>Exp4 Adobe阅读器漏洞攻击 实验内容 初步掌握平台matesploit的使用 有了初步完成渗透操作的思路 本次攻击对象为:windows xp sp ...