面试题16:数值的整数次方

// 面试题16:数值的整数次方

// 题目:实现函数double Power(double base, int exponent),求base的exponent

// 次方。不得使用库函数,同时不需要考虑大数问题。

解题思路:

解题并不难,重要的是要考虑到输入的各种情况,并且有相应的处理。

double和int都是可以取负数和0的,如果base取0,exponent<0,结果显然是不存在的。

base取0,exponent取非负,直接返回1就可以了。

其他情况,正常运算就好,要注意如果exponent<0,应该取绝对值,完成幂次方之后再取倒数。

如果想提高代码运行效率的话,可以使用递归或者循环来把a^n分解

a^n=a^(n/2)*a^(n/2),n为偶数

  a^((n-1)/2)*a^((n-1)/2)*a,n为奇数

还有一点需要注意的就是,float、double类型的变量不能用==来比较,应该另外写个函数。

c/c++:

bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int absExp);

double Power(double base, int exponent) {
	//参数校验
	if (equal(base, 0.0) && exponent < 0) {
		g_InvalidInput = true;
		return 0.0;
	}

	//对指数exponent取绝对值
	unsigned int absExp = (unsigned int)(exponent);
	if (exponent<0)
		absExp = (unsigned int)(-exponent);

	//计算pow(base,absExp)
	double result = PowerWithUnsignedExponent(base, absExp);
	//若exponent<0,取倒数
	if (exponent<0)
		result = 1.0 / result;

	return result;
}

double PowerWithUnsignedExponent(double base, unsigned int absExp) {
	//递归中止的边界值
	if (absExp == 0)
		return 1;
	if (absExp == 1)
		return base;

	//简化计算量
	double result = 0;
	result = PowerWithUnsignedExponent(base, absExp >> 1);
	result *= result;
	if (absExp & 0x1 == 1)
		result *= base;

	return result;
}

bool equal(double num1, double num2){
	//double不能直接用==比较
	if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
		return true;
	else
		return false;
}

参考资料:

剑指offer第二版面试题16

原文地址:https://www.cnblogs.com/BoqianLiu/p/9445996.html

时间: 2024-11-03 12:33:38

面试题16:数值的整数次方的相关文章

菜鸟系列 Golang 实战 Leetcode —— 面试题16. 数值的整数次方

实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. ? 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例?2: 输入: 2.10000, 3 输出: 9.26100 示例?3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 ? 说明: -100.0 <?x?< 100.0 n?是 32 位

16. 数值的整数次方

面试题16. 数值的整数次方 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明: -100.0 < x < 100

16 数值的整数次方 (第3章 高质量的代码)

题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 不只要通过测试,要更着重代码的优化 测试用例: base与exponent分别取正数.0.负数  共3*3九种情况 解题思路: 1)为base与exponent区分正数.0.负数  全面但是不够高效率的解法 class Solution { public: bool g_InvalidInput = false; double Pow

面试题11-求数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 代码 import java.lang.Math; public class Solution { public double Power(double base, int exponent) { double result=1.0; int m=Math.abs(exponent); if(exponent==0){ return result; } for(int i=0

《剑指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 nu

剑指Offer--第16题 数值的整数次方

第16题 数值的整数次方 题目:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 看到有点懵,第一感觉觉得是不是应该考虑0的0次或者负数情况,还有就是浮点类型没办法使用"="号,最后自己以偷懒的方式直接调用Java的API,如果面试题中不让调用库函数,那么基本上这题就是挂了可能. 以上题目描述来自牛客,没有对使用做限制.真正的剑指offer上有限制条件不得使用库函数,同时不需要考虑大数问题. 自己的low代码 publ

剑指Offer对答如流系列 - 数值的整数次方

面试题15:数值的整数次方 题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 问题分析 三思而后行,这道题如果没事实现考虑好,非常容易出错. 首先分析列举出所有的场景. base的值 可能为正数也可能为负数(包含整数.小数) exponent的值可能为正整数也可能为负整数 base的值的处理是比较简单的,对于exponent的处理就要多加考虑了. 当exponent的值为负

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25506085 剑指offer上的第十一题,九度OJ上测试通过. 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开. 输出: 对应每

数值的整数次方-剑指Offer

数值的整数次方 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路 主要有几点需要注意 由于计算机表示小数(float和double)都有误差,不能直接用等号(==)判断两个小数是否相等.若两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等 注意考虑输入值得全面性,正负可能,而且0的负数次幂没意义. 代码 解法一: public class Solution { public double Powe