Как я могу проверить, лежит ли число между двумя членами математической прогрессии? например А.П., Г.П. или любой другой прогресс - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу назначить уровень для номера, как показано ниже:

Если число лежит между 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
                      ))  

Что кажется сложным, а также нет предела этому.

Есть ли лучший способ решить эту проблему в JavaScript?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Используйте логарифм, Люк:

level = Math.ceil(Math.log(x) / Math.log(3))
0 голосов
/ 06 сентября 2018

Из вашего последнего редактирования кажется, что это больше невозможно сделать с логарифмами, поэтому вам нужно будет подсчитать вместо этого:

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-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 уровней (скажем) в массив, а затем просто отсканировать это, чтобы найти уровень, или даже двоичный поиск в этом массиве, чтобы найти ответ в более постоянное время (сначала проверяя, что входное значение <= верхнее предварительно вычисленное значение, и возвращаясь к этому методу, если нет). </p>

0 голосов
/ 05 сентября 2018

Одним из решений было бы сделать цикл 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)

Что мы делаем здесь:

  1. Начиная с 0
  2. Создайте наше низкое значение 3 ^ 0
  3. Создайте наше высокое значение 3 ^ 1
  4. Проверьте, находится ли наш номер между
  5. Верните его, если это так
  6. В противном случае продолжить

Далее он проверит 3 ^ 1 и 3 ^ 2 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...