#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; } Но ждите, пока кто-то даст ответ с красивой математикой)) Я попробовал найти закономерность - сдался)
Комментариев нет:
Отправить комментарий