Хочу подсчитать количество нулей которые повстречаются, если посчитать от единицы до введенного числа. Например если ввести число 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.
Однострочно можно и через строку пойти
function countZeros(num) {
return (num + '').split('').reduce((x, y) => x + (y === '0'), 0);
}
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));
Решение грубым перебором, для каждого отдельного числа считает ноли.
Для 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;
}
Но ждите, пока кто-то даст ответ с красивой математикой)) Я попробовал найти закономерность - сдался)
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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пытаюсь делать задачи с codewars чтобы поднять скилл но вместо этого падает мая самооценка
Так как я практикуюсь в js и его возможностях, мне потребовалось найти способ сохранения данных в моем приложенииЯ узнал что браузер напрямую...