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

У меня такое решение:

var number = 6567;
var quantity = 0;

while (Math.trunc(number) != 0) {
quantity++;
number /= 10;
}
console.log(quantity);

Попробуй вставить number = 65478.
quantity получится на одну цифру больше.
Это не верное решение.

В этом ключе я решил так:
var number = 6567;
var quantity = 0;

while (Math.trunc(number) != 0) {
quantity++;
number /= 10;
}
console.log(quantity);

1 лайк

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

Я это сделал! Всё работает идеально))

Мне кажется в данном задании это самое верное решение. Посмотрев другие ответы, которые мне показались слишком огромными, этот вариант явно выигрывает. Но, я, например, не знала о таком варианте.

2 лайка

Ну самое оптимальное решение через .length и приведение в строку, но если этого не знать, то вот:

моё рабочее
if (number != 0) {
  for (var i = 1; Math.abs(number / i) >= 1; i*= 10) {
    quantity++;
    } 
} else {quantity = 1;}
console.log('Количество циферей: ' + quantity);

Добавлены проверки на 0 и отрицательные числа, буду рад если кто дополнит проверкой на целые числа.

var number = 123;
var quantity = 0;

while (number >= 1) {
  number/= 10;
  quantity++;
}
1 лайк

минимализм while (number>10){number/=10; quantity++}

Вопрос, скорее всего, к разработчикам (но это не точно). Почему без явного указания метода console.log в консоль выводится неверный результат:

без

с

Не разработчик: возможно это связано с тем что ++ постфиксный, а не префиксный
но это не точно :slight_smile:

и quantity изменится не в момент наращивания, а после

Поэтому некоторые разработчики предпочитают такую запись

var number = 1234;
var quantity = 0;
 
for (var i=1; Math.abs(number / i) >= 1; i *= 10) {
	quantity += 1;
}
1 лайк

смотрите как выходит с постфиксами (q++): в конце 4 итерации возвращает значение 3, увеличивает его на единицу и записывает в ячейку quantity уже 4.
если бы была префиксная форма (++q), то сначала увеличивает на единицу, возвращает 4 и записывает в переменную 4.
в консоли вы естественно видите “возврат значения”.
если же вы применяете метод console.log(value), то он вам вернет value, вопрос в какой момент вы хотите его получить.
проверьте например так:

префиксная форма
var number = 1234;
var quantity = 0;
 
for (var i=1; Math.abs(number / i) >= 1; i *= 10) {
	console.log(++quantity);
}
постфиксная форма
var number = 1234;
var quantity = 0;
 
for (var i=1; Math.abs(number / i) >= 1; i *= 10) {
	console.log(quantity++);
}

Заметьте, что если вы поставите console.log(quantity) после цикла, то он и там и там даст 4.

1 лайк

Все, поняла) Спасибо огромное!

На мой взгляд, данный код работает только на 50%.
Ведь если будет дробное число, то выдаст, что символов явно больше, за счет того, что будет так же посчитана точка, которая разделяет целое от дробного.

У меня получилось что-то в таком духе:

var number = 1234.532;
var quantity = 0;

if (number%1 !== 0) {
console.log(quantity = number.toString().length - 1);
}else{
console.log(quantity = number.toString().length);
}

Вот ещё один вариант работы, может кому полезно будет, через Math

var number = 555555;
var quantity = 0;
var p
for (var i=0;i>=0;i++){
p = Math.trunc(number / (Math.pow(10,i)));
if(p === 0){
break
}
else{
quantity=quantity+1;
}
}
console.log(quantity);

тоже решила через преобразование в строку и вычисление number.length.

for (var i = number;Math.trunc(i) >= 1;i/=10) {
quantity++;
}
console.log(quantity);

Мдаа… тяжело мне ещё дается цикл на уменьшение интерации… Ели сделал.

После решения задачи для целых чисел:

while (number >= 1)  {  
  number = (number * 0.1);  
  if (Math.round(number) >= 1) {
    quantity++;    
    } else {
        quantity++;
        break;              
      }
}
console.log('В числе: ' + quantity + ' цифр(а_ы)!'); 

немного увлекся и продолжил делать для значения “0” и для отрицательных. И поскольку в курсах еще не встречал String().length, Math.abs и прочее, то рабочий вариант получился объёмным, но для всех значений (кроме дробных) - выполняется верно:

while (number >= 1 || number < 0)  {    
  if (Math.round(number) >= 1 || Math.round(number) < -1) {
    quantity++;    
    } else {
        quantity++;
        break;              
      }
}
if (number === 0) {
    console.log('В числе 0: 1 цифра!');  
  } else {
      console.log('В числе: ' + quantity + ' цифр(а_ы)!');  
    }

лучше бы время потратили на изучение “String().length, Math.abs и прочее” :sweat_smile:

var number = -11;
var quantity = 0;
while (number) {
  number /= 10;
  quantity++;
  if (!Math.round(number)) {
     break;
  }
}
if (!number) {
  console.log('В числе 0: 1 цифра!');
} else {
  console.log('В числе: ' + quantity + ' цифр(а_ы)!');
}

вот так покороче было бы
тем более, что с отрицательными числами у вас не срослось, на -100 показывает 2 цифры, на -1000 - 3 цифры и т.д.
Поправил ваш код, чтобы работал как задумывали вы.

Добавлю на всякий случай улучшенный свой вариант, а то старые сообщения нельзя редачить.

через .length
var number = -100;
var quantity = 0;
quantity = (Math.abs(number)+[]).length;
console.log('Количество циферей: ' + quantity);
через for
var number = -100;
var quantity = 0;
if (number) {
  for (var i = 1; Math.abs(number / i) >= 1; i*= 10) {
    quantity++;
  } 
} else {quantity = 1;}
console.log('Количество циферей: ' + quantity);

Потратил :slightly_smiling_face:, но хотелось, следуя хронологии курсов, обойтись без них)
Спасибо за поправки, интересно было иную логику увидеть.

У меня оба варианта сработали.
С циклом FOR:
var number = 123;
var quantity = 0;

for(number; number>1; quantity++) {
number=number/10;
}
console.log(quantity);

И с циклом WHILE:
var number = 123;
var quantity = 0;

while(number>1) {
number=number/10;
quantity++;
}
console.log(quantity);

Немного жаль number в этой ситуации, кажется, мы его потеряли…
console.log(number);