Ввод чисел с клавиатуры до появления завершающего нуля — классическая задача программирования, которая часто встречается в учебных курсах и практических тестах. Она проверяет умение работать с циклами, условиями и базовой логикой обработки данных. Но когда речь заходит о подсчёте конкретно двузначных чисел в таком потоке, многие сталкиваются с нюансами: как правильно определить диапазон, не пропустить краевые случаи (например, число 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— не двузначные.
⚠️ Внимание: Если в условии задачи не указано иное, отрицательные числа считаются двузначными по модулю. Однако в некоторых системах (например, при работе с финансовыми данными) может потребоваться отдельная обработка знака.
Алгоритм решения: шаг за шагом
Общая схема решения выглядит так:
- Инициализировать счётчик двузначных чисел (
count = 0). - Запустить бесконечный цикл (
while True), который будет прерван при вводе0. - Внутри цикла:
- Считать число с клавиатуры.
- Если число равно
0— выйти из цикла. - Проверить, попадает ли абсолютное значение числа в диапазон
10–99. - Если да — увеличить счётчик.
- После выхода из цикла вывести значение счётчика.
На практике этот алгоритм можно реализовать разными способами в зависимости от языка. Например, в Python удобно использовать функцию abs() для модуля, а в C++ — оператор % для проверки количества цифр.
Реализация на 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
Особенности реализации на 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.