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

85
20 июня 2021, 19:30

Хочу подсчитать количество нулей которые повстречаются, если посчитать от единицы до введенного числа. Например если ввести число 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.

Answer 1

Однострочно можно и через строку пойти

function countZeros(num) {
    return (num + '').split('').reduce((x, y) => x + (y === '0'), 0);
}
Answer 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));

Answer 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; 
}

Но ждите, пока кто-то даст ответ с красивой математикой)) Я попробовал найти закономерность - сдался)

Answer 4
function countZeros(n) {
    let sum=0
    for (let i = 1; i<=n; i++){
        `${i}`.split('').forEach(element => {
           if( element.includes('0')){
            sum +=1
           }
        });
    }
    return sum
}
countZeros(20); // 2 – два нуля, по одному в числах 10 и 20
countZeros(100); // 11 – 11 нулей в числах: 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

Я вот так решил,делаю из числа i массив и перебираю каждое его значение, проверяя содержит ли оно 0. Если да прибавляю 1 к переменной sum.

READ ALSO
как работать с экспортом?

как работать с экспортом?

у меня есть файл userjs мне нужно использовать его параметры

113
Как получить доступ к стилям из JavaScript?

Как получить доступ к стилям из JavaScript?

Сейчас у меня есть стиль в stylecss:

125
return возвращает undefined

return возвращает undefined

Пытаюсь делать задачи с codewars чтобы поднять скилл но вместо этого падает мая самооценка

71
Генерация файла и скачивание его через JS

Генерация файла и скачивание его через JS

Так как я практикуюсь в js и его возможностях, мне потребовалось найти способ сохранения данных в моем приложенииЯ узнал что браузер напрямую...

98