Сколько двузначных чисел введено с клавиатуры до нуля: полное руководство с примерами

Ввод чисел с клавиатуры до появления завершающего нуля — классическая задача программирования, которая часто встречается в учебных курсах и практических тестах. Она проверяет умение работать с циклами, условиями и базовой логикой обработки данных. Но когда речь заходит о подсчёте конкретно двузначных чисел в таком потоке, многие сталкиваются с нюансами: как правильно определить диапазон, не пропустить краевые случаи (например, число 100 или -99) и оптимизировать код.

Эта статья не только разберёт алгоритм решения задачи на разных языках программирования, но и раскроет скрытые подводные камни, с которыми сталкиваются новички. Мы рассмотрим варианты для Python, C++, JavaScript и других языков, а также обсудим, как адаптировать решение под специфические условия — например, если числа могут быть отрицательными или вводиться в виде строк. Особое внимание уделим проблеме "ложных двузначных чисел" (когда число по модулю попадает в диапазон 10–99, но само является трёхзначным, например, -100).

Постановка задачи: что значит "двузначное число"?

Прежде чем писать код, нужно чётко определить, какие числа считать двузначными. На первый взгляд ответ очевиден: от 10 до 99. Однако в реальных задачах часто возникают уточнения:

  • 🔢 Положительные числа: только 10–99, или также 0–9 и 100+ учитываются иначе?
  • 🔣 Отрицательные числа: -99 — это двузначное? А -100?
  • 📏 Нулевые значения: 0 завершает ввод, но как быть с 00, 0.0 или пустой строкой?

В большинстве учебных задач под двузначными подразумеваются числа, у которых абсолютное значение (модуль) находится в диапазоне [10, 99]. То есть:

  • 15, -42, 99 — двузначные.
  • 5, 100, -100, 0 — не двузначные.
⚠️ Внимание: Если в условии задачи не указано иное, отрицательные числа считаются двузначными по модулю. Однако в некоторых системах (например, при работе с финансовыми данными) может потребоваться отдельная обработка знака.

Алгоритм решения: шаг за шагом

Общая схема решения выглядит так:

  1. Инициализировать счётчик двузначных чисел (count = 0).
  2. Запустить бесконечный цикл (while True), который будет прерван при вводе 0.
  3. Внутри цикла:
    1. Считать число с клавиатуры.
    2. Если число равно 0 — выйти из цикла.
    3. Проверить, попадает ли абсолютное значение числа в диапазон 10–99.
    4. Если да — увеличить счётчик.
  4. После выхода из цикла вывести значение счётчика.

На практике этот алгоритм можно реализовать разными способами в зависимости от языка. Например, в Python удобно использовать функцию abs() для модуля, а в C++ — оператор % для проверки количества цифр.

📊 Какой язык программирования вы используете чаще?
Python
C++
JavaScript
Java
Другой

Реализация на Python: просто и лаконично

В Python задача решается буквально в 5 строк благодаря динамической типизации и встроенным функциям. Вот базовый пример:

count = 0

while True:

num = int(input())

if num == 0:

break

if 10 <= abs(num) <= 99:

count += 1

print(count)

Этот код:

  • 🔄 Бесконечно считывает числа, пока не встретит 0.
  • 📊 Использует abs(num) для проверки модуля числа.
  • 📈 Увеличивает счётчик только для чисел из диапазона [10, 99].
⚠️ Внимание: Если на вход подадут не число (например, строку или символ), программа завершится с ошибкой ValueError. Для защиты от этого добавьте обработку исключений:

try:

num = int(input())

except ValueError:

print("Ошибка: введите целое число!")

continue

☑️ Проверка кода на Python

Выполнено: 0 / 5

Особенности реализации на C++

В C++ задача решается с помощью цикла while и потокового ввода cin. Главное отличие от Python — необходимость явного объявления типов переменных и обработки потока ввода:

#include <iostream>

using namespace std;

int main() {

int count = 0;

int num;

while (cin >> num) {

if (num == 0) break;

if (abs(num) >= 10 && abs(num) <= 99) {

count++;

}

}

cout << count << endl;

return 0;

}

Ключевые моменты:

  • 🔧 Переменные count и num объявлены как int.
  • 📥 Цикл while (cin >> num) автоматически проверяет успешность ввода.
  • 📉 Для выхода из цикла используется break при вводе 0.

В C++ также важно учитывать, что при вводе нечислового значения (например, буквы) поток cin переходит в состояние ошибки. Чтобы избежать зацикливания, можно добавить проверку:

if (cin.fail()) {

cin.clear(); // Сбросить флаг ошибки

cin.ignore(10000, '\n'); // Очистить буфер

cout << "Ошибка: некорректный ввод!" << endl;

continue;

}

JavaScript: работа с вводом в браузере

В JavaScript задача усложняется тем, что стандартный ввод/вывод отсутствует — данные обычно считываются из HTML-форм или prompt. Пример для консоли (Node.js):

const readline = require('readline');

const rl = readline.createInterface({

input: process.stdin,

output: process.stdout

});

let count = 0;

rl.on('line', (input) => {

const num = parseInt(input);

if (num === 0) {

console.log(count);

rl.close();

} else if (Math.abs(num) >= 10 && Math.abs(num) <= 99) {

count++;

}

});

Для браузера можно использовать prompt (хотя это устаревший метод):

let count = 0;

while (true) {

let input = prompt("Введите число (0 для завершения):");

let num = parseInt(input);

if (num === 0 || isNaN(num)) break;

if (Math.abs(num) >= 10 && Math.abs(num) <= 99) count++;

}

alert(`Двузначных чисел: ${count}`);

⚠️ Внимание: В браузере prompt возвращает строку, поэтому обязательно используйте parseInt или Number для преобразования. Также учтите, что prompt блокирует выполнение скрипта до ввода пользователя.

Краевые случаи и ошибки: что может пойти не так?

Даже в простой задаче есть нюансы, которые часто упускают из виду. Рассмотрим типичные ошибки и как их избежать:

Ситуация Проблема Решение
Ввод 100 или -100 Число не является двузначным, но может быть ошибочно засчитано, если проверять только первую цифру. Всегда использовать abs(num) >= 10 && abs(num) <= 99.
Ввод нечислового значения Программа завершается с ошибкой (например, ValueError в Python). Добавить обработку исключений или проверку isNaN (в JS).
Ввод числа с плавающей точкой (15.0) Если не преобразовать в int, может быть засчитано как нецелое. Использовать int(float(input())) в Python или Math.floor в JS.
Пустая строка или пробел Может привести к зацикливанию или ошибке. Проверять длину введённой строки перед преобразованием.

Ещё одна распространённая ошибка — неправильная инициализация счётчика. Например, если забыть обнулить count перед циклом, результат будет некорректным. Также стоит помнить, что в некоторых языках (например, C++) неинициализированные переменные могут содержать "мусорные" значения.

Что будет, если ввести очень большое число?

В большинстве языков целочисленные переменные имеют ограничения (например, в C++ int хранит значения от −2 147 483 648 до 2 147 483 647). Если ввести число за пределами этого диапазона, произойдёт переполнение, и программа может завершиться аварийно или засчитать число неправильно. Для защиты используйте long long в C++ или проверку диапазона.

Оптимизация и альтернативные подходы

Базовое решение задачи уже достаточно эффективное, но его можно улучшить:

  • 🔄 Цикл do-while: В некоторых языках (например, C++) удобнее использовать do-while, чтобы гарантированно выполнить хотя бы одну итерацию.
  • 📌 Побитовая проверка: Для целых чисел можно проверять диапазон через побитовые операции (например, (num & 0xFFFF) >= 10), но это менее читаемо.
  • 📊 Массив чисел: Если числа нужно сохранить для дальнейшей обработки, можно записывать их в массив и потом анализировать.

Пример на C++ с do-while:

int count = 0;

int num;

do {

cin >> num;

if (abs(num) >= 10 && abs(num) <= 99) count++;

} while (num != 0);

cout << count;

Также стоит рассмотреть вариант с регулярными выражениями (если числа вводятся строками). Например, в Python можно проверять соответствие шаблону ^-?\d{2}$ (две цифры, возможно со знаком):

import re

count = 0

while True:

s = input().strip()

if s == "0": break

if re.fullmatch(r'-?\d{2}', s):

count += 1

print(count)

FAQ: ответы на частые вопросы

Можно ли решить задачу без использования цикла?

Технически да, но это нецелесообразно. Например, в Python можно использовать рекурсию:

def count_two_digit(count=0):

num = int(input())

if num == 0:

return count

if 10 <= abs(num) <= 99:

count += 1

return count_two_digit(count)

print(count_two_digit())

Однако такой подход менее эффективен и может привести к переполнению стека при большом количестве итераций.

Как модифицировать код, чтобы учитывать числа от 100 до 999 (трёхзначные)?

Достаточно изменить условие проверки на 100 <= abs(num) <= 999. Например, в Python:

if 100 <= abs(num) <= 999:

count += 1

Что делать, если числа вводятся через запятую в одной строке?

В этом случае нужно сначала разбить строку на отдельные числа. Пример на Python:

numbers = list(map(int, input().split(',')))

count = 0

for num in numbers:

if num == 0: break

if 10 <= abs(num) <= 99:

count += 1

print(count)

Как адаптировать решение для работы с файлом вместо клавиатурного ввода?

Замените input() на чтение из файла. Пример на Python:

with open('numbers.txt', 'r') as file:

count = 0

for line in file:

num = int(line.strip())

if num == 0: break

if 10 <= abs(num) <= 99:

count += 1

print(count)

Почему мой код не работает с отрицательными числами?

Скорее всего, вы забыли взять модуль числа (abs(num)). Без этого отрицательные числа (например, -15) не попадут в диапазон 10–99, так как проверка будет выполняться для -15, а не 15.