数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 时间限制:3秒 空间限制:32768K
思路
先判断指数的区间,在依据底来判断
代码
function Power(base, exponent)
{
// write code here
if(exponent > 0) {
let result = 1;
while(exponent > 0) {
result *= base;
exponent--;
}
return result;
} else if(exponent == 0) {
if(base > 0) {
return 1;
} else {
return false;
}
} else {
if(base == 0) {
return 1;
} else {
let result = 1;
let numbrer = Math.abs(exponent);
while(numbrer > 0) {
result *= base;
numbrer--;
}
return 1 / result;
}
}
}
运行时间:14ms
占用内存: 5340k
简化版代码
考虑到以上代码有逻辑重合部分,因此给出简化代码;单独列出返回false的情况,其他情况下依据指数的正负,返回分数或整数;
function Power(base, exponent)
{
// write code here
var result = 1;
for(var i = 0; i < Math.abs(exponent); i++) {
result *= base;
}
if(base == 0 && exponent <= 0) {
return false;
} else if(exponent < 0) {
return 1 / result;
} else {
return result;
}
}
时间复杂度仍为O(n)
最佳代码
参考:
- 二分幂
function Power(base, exponent)
{
// write code here
function fnc(base, exponent) {
if(exponent == 0) {
return 1;
} else if(exponent == 1) {
return base;
} else {
var result = fnc(base, Math.floor(exponent / 2));
result *= result;
if(exponent & 1) {
return result * base;
} else {
return result;
}
}
}
if(base == 0 && exponent <= 0) {
return false;
}
var result = fnc(base, Math.abs(exponent));
return exponent > 0 ? result : (1 / result);
}
- 简单快速幂
function Power(base, exponent)
{
// write code here
if(base == 0 && exponent <= 0) {
return false;
}
var absOfExponent = Math.abs(exponent);
var current = base;
var result = 1;
while(absOfExponent > 0) {
if(absOfExponent & 1) {
result *= base;
}
base *= base;
absOfExponent >>= 1;
}
return exponent > 0 ? result : (1 / result);
}