原创博文,转载请注明出处!

1.题目

      给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方。注意:不得使用库函数,同时不需要考虑大数问题。
 class Solution {
public:
double Power(double base, int exponent) { }
};

2.思路

# 解题思路(分情况讨论)

  • 无效输入:base=0,exponent<0时,错误输入,输出为0并设置全局变量InvalidInput=true。
  • 无效输入:base=0,exponent=0时,无效错误,数学上无意义,输出为0和1均可,程序中设置为1。
  • 有效输入:exponent > 0时,直接计算;exponent < 0,指数取绝对值计算result,最后result去倒数。

①当程序中出现错误时,三种错误处理方式(异常、返回值、全局变量)的优缺点。

②判断两个浮点数是否相等

    // 判断两个浮点数是否相等
bool Equal(double num1,double num2)
{
if((num1-num2) > -0.0000001 && (num1-num2)<0.0000001)
return true;
else
return false;
}

③以时间复杂度O(logn)计算指数

    // 以时间复杂度O(logn)求整数的指数(递归)
double WithUnsignedExponent(double base,unsigned int exponent)
{
if(exponent == 0)
return 1; if(exponent == 1)
return base; // 递归计算指数
double result = WithUnsignedExponent(base,exponent>>1); // 指数是奇数或偶数
if(exponent & 1 == 1)
{
result *= result;
result *= base;
}
else
{
result *= result;
} return result;
}

  

3.code

#include <iostream>
using namespace std; // 全局变量:标识无效输入
bool InvalidInput = false; class Solution {
public:
double Power(double base, int exponent)
{
InvalidInput = false; // 无效输入:底数是零,指数是负数
if(Equal(base,0.0) && exponent < 0)
{
InvalidInput = true;
return 0.0;
} // 指数为正和指数为负,分类处理
double res = 0.0;
if(exponent < 0)
res = 1.0/WithUnsignedExponent(base,-exponent);
else
res = WithUnsignedExponent(base,exponent);
return res;
} // 判断两个浮点数是否相等
bool Equal(double num1,double num2)
{
if((num1-num2) > -0.0000001 && (num1-num2)<0.0000001)
return true;
else
return false;
} // 以时间复杂度O(logn)求整数的指数(递归)
double WithUnsignedExponent(double base,unsigned int exponent)
{
     // 特殊情况
if(exponent == 0)
return 1; if(exponent == 1)
return base; // 递归计算指数
double result = WithUnsignedExponent(base,exponent>>1); // 指数是奇数或偶数
if(exponent & 1 == 1)
result = result * result * base;
else
result = result * result; return result;
}
}; int main()
{
Solution solution;
double base = 0.0;
int exponent = 0;
cout<<solution.Power(base,exponent)<<endl;
return 0;
}

4.复杂度

  时间复杂度O(logn)

5.测试用例

  底数为正数,负数,零

  指数为正数,负数,零

【剑指offer-16】数值的整数次方,C++实现(递归)的更多相关文章

  1. 剑指 Offer 16. 数值的整数次方

    实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 来源:力扣(LeetCode) 链接 ...

  2. 《剑指offer》 数值的整数次方

    本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...

  3. 【剑指Offer】数值的整数次方 解题报告(Python)

    [剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  4. 【Java】 剑指offer(15) 数值的整数次方

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 实现函数double Power(double base, int ...

  5. (3)剑指Offer之数值的整数次方和调整数组元素顺序

    一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...

  6. 【剑指offer】数值的整数次方

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/25506085 转载请注明出处:http:// ...

  7. Go语言实现:【剑指offer】数值的整数次方

    该题目来源于牛客网<剑指offer>专题. 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不 ...

  8. 剑指OFFER之数值的整数次方(九度OJ1514)

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表 ...

  9. 剑指Offer 12. 数值的整数次方 (其他)

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目地址 https://www.nowcoder.com/practice/ ...

  10. 剑指offer:数值的整数次方

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解题思路: 一开始直接用一个for循环做连乘,测了一下,发现这个指数可能是负 ...

随机推荐

  1. 爬虫bs4

    CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会 ...

  2. Java数字证书操作

    为服务器生成证书 keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500 为 ...

  3. UVA 12063 Zeros and Ones(三维dp)

    题意:给你n.k,问你有多少个n为二进制的数(无前导零)的0与1一样多,且是k的倍数 题解:对于每个k都计算一次dp,dp[i][j][kk][l]表示i位有j个1模k等于kk且第一位为l(0/1) ...

  4. SpringBoot创建定时任务

    之前总结过spring+quartz实现定时任务的整合http://www.cnblogs.com/gdpuzxs/p/6663725.html,而springboot创建定时任务则是相当简单. (1 ...

  5. Gym - 100712B Rock-Paper-Scissors

    https://vjudge.net/problem/Gym-100712B 题意: 石头剪刀布游戏. 给出一个玩家n局的出的顺序,现在另一个是这样出的,X+Y+Z=n,在前X轮出石头,中间Y轮出布, ...

  6. JavaScript高级程序设计-读书笔记(2)

    第6章 面向对象的程序设计 创建对象 1.最简单方式创建Object的实例,如 var person = new Object(); person.name = “Greg”; person.age ...

  7. 实现基本的Ajax和Json请求

    前面已经封装好了一个方法ajax(),通过这个方法可以实现Ajax请求,接下来就是给出 例程来测试这个方法和实现简单的功能.   视图的部分代码如下: <body> <div> ...

  8. PHP XML Parser 函数

    PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XML 教程 中找到更多有关 XML 的 ...

  9. 搞懂分布式技术10:LVS实现负载均衡的原理与实践

    搞懂分布式技术10:LVS实现负载均衡的原理与实践 浅析负载均衡及LVS实现 原创: fireflyc 写程序的康德 2017-09-19 负载均衡 负载均衡(Load Balance,缩写LB)是一 ...

  10. 十八 Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/env python # -*- coding:utf8 -*- from scrapy.cmdline import ...