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