@puffy859

Как решить задачу по JS?

Помогите решить задачу, пожалуйста:
Необходимо написать функцию counter, которая принимает в виде аргументов два числа: старт и конец. Функция должна возвращать число элементов массива между числами, за исключением числа, в котором содержится число 5.
Стартовое и конечное число включается в число элементов массива.
Результат может содержать число 5.
Стартовое число всегда меньше конечного. Оба числа могут отрицательными.

Я написал решение, оно не проходит все тесты, плюс я уверен, что можно как то решить проще.
Мой код:
function counter(min, max) {
    let newArray =[]
    let result = 0
    if (min >=0 && max >= 0){
        for (let i = min; i <= max; i +=1){
        {newArray.push(i)}
        result = newArray.length -1
    }}
    else if ( min <= 0 && max <=0)
    {
        for (let i = min; i <= max; i +=1){
        {newArray.push(i)}
        result = newArray.length
         }}
    else if (min <= 0 || max <=0 && max <= 5){
        for (let i = min; i <= max; i +=1){
        {newArray.push(i)}
        result = newArray.length -1
         }}
         return result
   }
  • Вопрос задан
  • 502 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
function count(min, max) {
  let counter = 0;
  for (let n = min; n <= max; n++) {
    if (!n.toString(10).includes('5')) counter++;
  }
  return counter;
}

count(4, 17)  // 12
Определять, есть ли в числе цифра 5 можно и иначе, без преобразования в строку, но так короче )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Вариант для bigint, который быстро считает результат даже для громадных чисел:

// вспомогательная функция
function countDig(n, pow, pow10, pow9) {
    const dig = n / pow10;
    const count = dig < 6n ? dig : dig - 1n;
    return count * pow9 + (dig === 5n || pow < 1n ? 0n : countDig(n % pow10, pow - 1n, pow10 / 10n, pow9 / 9n));
}

// количество беспятёрочников на отрезке [0...n-1]
function countWithout5(n) {
    let pow = 0n, pow10 = 1n;
    while (pow10 * 10n <= n) {
        pow++;
        pow10 = pow10 * 10n;
    }
    return countDig(n, pow, pow10, 9n ** pow);
}

function count(min, max) {
    if (min > max) {
        return 0n;
    }
    if (min >= 0n) {
        return countWithout5(max + 1n) - countWithout5(min);
    }
    if (max <= 0n) {
        return countWithout5(1n - min) - countWithout5(-max);
    }
    return countWithout5(max + 1n) + countWithout5(1n - min) - 1n;
}

count(4n, 17n);  // 12n

count(-3455534n, 1731643265265475472546254726454363145657453757347547n);
// результат 7912695757329425999049503116097171379949505558054n


в решении используется тот факт, что на отрезке от 0 до (10^k)-1 включительно (то есть для неотрицательных чисел длиной не более k) существует всего 9^k чисел, не содержащих пятерку. Почему столько? Это числа длиной k, если слева дозаполнить нулями, и на каждом разряде возможно 9 разных цифр, итого 9^k вариантов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы