【剑指offer-16】数值的整数次方,C++实现(递归)
原创博文,转载请注明出处!
1.题目
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++实现(递归)的更多相关文章
- 剑指 Offer 16. 数值的整数次方
实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 来源:力扣(LeetCode) 链接 ...
- 《剑指offer》 数值的整数次方
本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...
- 【剑指Offer】数值的整数次方 解题报告(Python)
[剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 【Java】 剑指offer(15) 数值的整数次方
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 实现函数double Power(double base, int ...
- (3)剑指Offer之数值的整数次方和调整数组元素顺序
一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...
- 【剑指offer】数值的整数次方
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/25506085 转载请注明出处:http:// ...
- Go语言实现:【剑指offer】数值的整数次方
该题目来源于牛客网<剑指offer>专题. 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不 ...
- 剑指OFFER之数值的整数次方(九度OJ1514)
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表 ...
- 剑指Offer 12. 数值的整数次方 (其他)
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目地址 https://www.nowcoder.com/practice/ ...
- 剑指offer:数值的整数次方
题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 解题思路: 一开始直接用一个for循环做连乘,测了一下,发现这个指数可能是负 ...
随机推荐
- java直接计算一个算术题
import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptE ...
- vue.js的一些小语法v-for,v-text,v-html,v-on:click
1.Vue的目录结构: ======================================================================================== ...
- 爬虫框架Scrapy之案例二
新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(s ...
- spark SQL学习(案例-统计每日uv)
需求:统计每日uv package wujiadong_sparkSQL import org.apache.spark.sql.{Row, SQLContext} import org.apache ...
- hdu1009 - 贪心
2017-07-14 18:18:31 writer:pprp 介绍:hdu1009 题目介绍,详见hdu1009 代码如下 #include <iostream> #include &l ...
- linux一键安装mysql脚本
#!/bin/sh if [ -s /etc/my.cnf ];then rm -rf /etc/my.cnf fi echo "------------------------------ ...
- CALL_AND_RETRY_LAST Allocation failed node打包报错
全局安装increase-memory-limit: npm install -g increase-memory-limit 进入工程目录,执行: increase-memory-limit
- ANDROID教程目录
html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
- 初识 JVM
发展历史 1996年,SUN JDK 1.0 Classic VM 发布,纯解释运行,使用外挂进行JIT 1997年 JDK1.1 发布.包含了:AWT.内部类.JDBC.RMI.反射 1998年 J ...
- Android开发--List与ArrayList区别
List是一个接口,而ArrayList是一个类. ArrayList继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ArrayList就可以被构造. ...