Испытание "Сколько цифр?"


#1

Условия задачи: “Кекс хочет, чтобы вы написали программу, которая умеет определять количество цифр в любом целом числе.”

Но в проверке тестируется решение только на натуральных числах. А надо бы еще 0, отрицательные числа и числа вида 10^n, где n - натуральное или ноль (т.е. 1, 10, 100 и т.д. - там легко допустить ошибку).

Мое решение:

var i = 1;
while (Math.abs(number / i) >= 1) {
  quantity ++;
  i *= 10;
}

#2

У меня получилось через преобразование числа в строку toSring и подсчет ,длинны строки .length


#3

Вот такой вариант еще:

var number = 123;
var quantity = 0;
for (var i = 1; number / i >= 1; i *= 10) {
quantity ++;
}

Можно модифицировать для проверки не только натуральных чисел, но об этом уже написали выше


#4

Те, кто проходит курсы, не знают такого приема :slight_smile:


#5

Вариант считает неправильно.


#6

Странно, у меня все работает


#7

Об этом я и пишу - неверные решения проходят проверку. В условии написано про целые числа.


#8

А, ну да, в испытании просто нет проверки на отрицательные числа, я исходила из этого. А так эта проблема решается добавлением Math.abs


#9

Если честно, про Math.abs я нагуглил позднее, сперва делал конструкции типа извлечения корня из квадрата значения или проверку условия на отрицательность :slight_smile:

Кстати, ваше решение универсально в том плане, что считает число знаков целой части даже в дробном числе.


#10

Мой вариант:

var number = 123;
var quantity = 0;
while (number > 1) {
  number /=10;
  quantity++;
}

Вопрос: в подсказке указано “округлять его на каждой итерации”, я так и не понял зачем на нужно будет округление?


#11

У меня получилось такое решение:

var number = 123;
var quantity = 0;

for(var i = 0; i < number; i++) {
  quantity = String(number).length;
}

#12

Для чего у Вас в решение используется цикл?


#13

Ну и я поделюсь

var number = 113213;
var quantity = 1;

while (number >= 10) {
  number = Math.round(number) / 10;
  quantity++
  }
  
  console.log('Цифр в числе ' + quantity)

#14

Мой вариант, хз норм он или нет:
Сделал через вычитание, а не деление
Вычитается из number введённая переменная i
увеличиваем i в десять раз на каждом шаге цикла, пока наш number не даст отрицательное значение.
т.е. из 123 сначала вычитаем 1, если number больше единицы, то добавляем quantity ++ и так далее 10, 100, 1000

var number = 123;
var quantity = 0;

for (var i = 1; number >= 0; i*=10) {
number-=i;
if (number >= 0) {
quantity++;
}
}
console.log(quantity);

Так же можно, дабы убрать условие if, изменить начальное значение i =1 на i = 10, но тогда получится, что в нашем примере он будет получать отрицательное значение на последнем шаге, но quantity будет добавляться единица и цикл остановится только при проверке условия следующего цикла

var number = 123;
var quantity = 0;

for (var i = 10; number >= 0; i*=10) {
number-=i;
quantity++;
}
console.log(quantity);


#15
var number = 123;
var quantity = 0;
quantity = String(number).length;

#16

Можно применить более простое приведение типов:
quantity = (’’ + number).length;


#17

Запуталась. Объясните, пожалуйста, почему этот вариант работает. В конкретном примере на третьей итерации получается ведь число меньше единицы.


#19

1 итерация:

  • число 123 больше 1 == условие выполняется
  • делим на 10 получается 12.3
  • увеличиваем счетчик == 1

2 итерация:

  • число 12.3 больше 1 == условие выполняется
  • делим на 10 получается 1.23
  • увеличиваем счетчик == 2

3 итерация:

  • число 1.23 больше 1 == условие выполняется
  • делим на 10 получается 0.123
  • увеличиваем счетчик == 3

4 итерация:

  • число 0.123 меньше 1 == цикл завершается

Итого quantity == 3.


#20

Спасибо)


#21

var number = 123;
var quantity = 0;
quantity = +(number.toString().length);