【发布时间】:2022-01-25 14:17:11
【问题描述】:
挑战:https://www.codewars.com/kata/57c7930dfa9fc5f0e30009eb/train/javascript
您好,我已经尝试这个问题好几个小时了,但不幸的是我的代码需要很长时间才能通过:
function closestPower(num) {
num = Math.floor(num);
if (num < 4) return 4;
// check if input is perfect power
let base = 2;
while (base < 10) {
let exponent = Math.trunc(getBaseLog(base , num));
if ( Math.pow(base, exponent) === num ) {
return num;
}
base++;
}
// check for upper and lower
base = 2;
const verifyObj = {upper:null, lower:null}; // verify
let upperPower = num + 1;
let lowerPower = num - 1;
while (!verifyObj.upper || !verifyObj.lower)
{
// no perfect power
if (lowerPower <= 2 ) verifyObj.lower = "Not found";
if (upperPower === Infinity ) verifyObj.upper = "Not found";
// up til base 9
if (base === 10) {
if (!verifyObj.upper) upperPower++;
if (!verifyObj.lower) lowerPower--;
base = 2;
}
// upper
if (!verifyObj.upper) {
let exponent = Math.trunc(getBaseLog(base , upperPower));
if ( Math.pow(base, exponent) === upperPower ) {
verifyObj.upper = upperPower;
}
}
// lower
if (!verifyObj.lower) {
let exponent = Math.trunc(getBaseLog(base , lowerPower));
if ( Math.pow(base, exponent) === lowerPower ) {
verifyObj.lower = lowerPower;
}
}
base++;
}
console.log(verifyObj) // {upper:64, lower: 49}
// nearest power
if ((upperPower - num) < (num - lowerPower)) {
return upperPower;
}
else return lowerPower;
}
closestPower(56.5); // 49
function getBaseLog(x, y) {
return Math.log(y) / Math.log(x);
}
我意识到我的代码是多余的,因为我只需要知道“基数”和“指数”是否大于 1 即可确定完美幂。有什么公式或想法吗?
【问题讨论】:
-
问题中是否有任何内容将基数限制为 10?如果不是,那为什么你的代码中有硬编码 10?
-
这个question 已经为您的问题提供了详细的答案,尽管没有代码。 @trincot 给出了一种高效算法的实现。
标签: javascript algorithm math