Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Подсчет нулей в введенном аргументе

#javascript #математика


Хочу подсчитать количество нулей которые повстречаются, если посчитать от единицы
до введенного числа. Например если ввести число 20, то ответ должен быть 2 (по нулю
в каждом числе 10 и 20), для 101 ответ 12. Для этого написал такую функцию:



function countZeros(n) {
    if ((n ^ 0)!==n || n<0 || isNaN(n)===true) {
        return false;
    }
    
    let result = 0;   // Результат
    let rank = 1;   // Номер разряда (начинаем с младших)
    let low = 0;   // Число в младших разрядах (изначально равно 0)
    let high = n;  // Число в старших разрядах (изначально равно n)
    
    for (high /= 10; high >= 1;) {
        
        if (high % 10 !== 0) {
            result += Math.floor(((high - 1) * rank) + (low + 1));
        }
        else {
            result += Math.floor(high * rank);
        }
        
        low += rank * (n % 10);  // Увеличиваем число в младших разрядах
        rank *= 10;           // Переходим к следующему разряду
        high /= 10;        // Уменьшаем число в старших разрядах
    }
    return result;




Но она считает правильно только если ввести цифры до 109 включительно.
Пробовал еще такой вариант:



let counterZeroes = 0;
    for (i = 10; n/i >= 1; i *= 10) {
        counterZeroes += Math.floor(n/i);
    }
    return counterZeroes; 




Но такая функция считает правильно только до 100.
    


Ответы

Ответ 1



Однострочно можно и через строку пойти function countZeros(num) { return (num + '').split('').reduce((x, y) => x + (y === '0'), 0); }

Ответ 2



function countZeros(n) { if (n == 0) return 1; var r = 0; if (n > 9) r = countZeros(n - 1); while (n > 0) { if (n % 10 == 0) r++; n = Math.floor(n / 10); } return r; } console.log(countZeros(20)); console.log(countZeros(102));

Ответ 3



Решение грубым перебором, для каждого отдельного числа считает ноли. Для 10,000,000 в хроме-75 выполняется около за 4 секунды) console.log( countZeros(20) ); console.log( countZeros(102) ); console.log( countZeros(1000) ); function countZeros(x){ let zeros = 0; for( let i = 10; i <= x; i++ ){ zeros += getZeros(i); } return zeros; } function getZeros(x){ return (("" + x).match(/0/g)||[]).length; } Но ждите, пока кто-то даст ответ с красивой математикой)) Я попробовал найти закономерность - сдался)

Комментариев нет:

Отправить комментарий