我要为数字分配一个级别,如下所示:
如果数字介于3到3 + 3 ^ 2之间,Level
应该为2。
如果数字介于3 + 3 ^ 2和3 + 3 ^ 2 + 3 ^ 3之间,Level
应该为3。
如果数字介于3 + 3 ^ 2 + 3 ^ 3和3 + 3 ^ 2 + 3 ^ 3 + 3 ^ 4之间,Level
应该为4。
....
等等...
我正在尝试这个。.
var level = (next_slot>3 && next_slot < 3+3**2)?1:(
(next_slot>3+3**2 && next_slot < 3+3**2+3+3**3)?2:(
next_slot>3+3**2+3**3 && next_slot < 3+3**2+3+3**3)?3:(
4
))
这似乎很复杂,而且没有限制。
有没有更好的方法来解决此问题?
答案 0 :(得分:3)
使用对数,卢克:
level = Math.ceil(Math.log(x) / Math.log(3))
答案 1 :(得分:1)
一种解决方案是使用一些最大常量创建一个for循环,然后在发现介于两个值之间时退出
const checkLevel = function(number) {
if (number <= 0) {
return 0 // failsafe since 3^0 is 1
}
const max = 10
for (let i = 0; i < max; i++) {
let low = Math.pow(3,i)
let high = Math.pow(3,(i+1))
console.log('our low is ' + low + ' and our high is ' + high)
console.log('lets check if ' + number + ' is between')
if (number >= low && number < high) {
console.log('it matches')
return i+1
} else {
console.log('no match, lets continue')
}
}
}
const level = checkLevel(4)
console.log('level',level)
我们在这里做的是:
接下来它将检查3 ^ 1和3 ^ 2,依此类推
答案 2 :(得分:0)
从您的最新编辑看来,对数不再可能这样做,因此您需要加算:
function findLevel(input) {
let level = 1;
let limit = 3;
let increment = 3*3;
while (input > limit) {
++level;
limit += increment;
increment *= 3;
}
return level;
}
您没有为限制本身指定行为,即3是属于级别1(0-3范围)还是2是3(3-12范围)。假定它属于较低级别,即3处于级别1而不是2。如果不正确,则将input > limit
更改为input >= limit
,即3处于级别2。
// Print the inclusive integer ranges for each level
let lastLevelStart = 0;
let lastLevel = findLevel(lastLevelStart);
for (let i = 1; i <= 10000; ++i) {
let level = findLevel(i);
if (level != lastLevel) {
console.log(`level ${lastLevel}: ${lastLevelStart} to ${i-1} inclusive`);
lastLevel = level;
lastLevelStart = i;
}
}
级别1:0到3(含)
2级:包括4到12
3级:13至39(含)
4级:包括40至120
5级:121至363(含)
6级:364至1092(含)
7级:包括1093至3279
8级:3280至9840(含)
这显然需要计算循环的输出级别数,并且在重用时将最终一次又一次地重复计算相同的极限值(尽管仅使用整数数学,因此相对便宜)。因此,如果您多次调用此方法或需要处理多个级别,那么您可能需要将前1000个级别的上限(例如)计算到数组中,然后进行扫描以查找级别或什至二进制搜索该数组以在更恒定的时间内找到答案(首先检查输入是否为<=最高预先计算的值,如果不是,则返回此方法)。