Разберемся с одним из подходов к вводу данных из стандартного потока через класс java.util.Scanner. Сделаем это на примере простой задачи с очень полезного сайта e-olimp.com
Задача
Введите из стандартного потока одно число. В предположении, что это положительное двузначное целое число выведите в стандартный поток вывода каждую его цифру отдельно (через пробел). Порядок цифр менять не следует.
Тесты
Никаких специфических случаев в алгоритме не предполагается. Делаем три теста — самое маленькое число допустимого диапазона, самое большое и какое-нибудь значение из середины диапазона.
Вход | Выход |
10 | 1 0 |
99 | 9 9 |
54 | 5 4 |
Решение
Воспользуемся классом java.util.Scanner, чтобы ввести данные в формате целого числа. И вычислим обе его цифры.
1 2 3 4 5 6 7 |
class Main{ public static void main (String[] args) throws java.lang.Exception { java.util.Scanner i = new java.util.Scanner(System.in); int n = i.nextInt(); System.out.println(n / 10 + " " + n % 10); } } |
Пояснения
- Описываем переменную i типа java.util.Scanner и тут же присваиваем ей значение нового объекта этого класса. Конструктор изготавливает объект Scanner’а из стандартного потока ввода. Т.е. i становится надстройкой над стандартным потоком ввода. Это позволяет нам прочесть целое число, а не просто читать методом read() по одному байту.
- С помощью метода nextInt() читаем последовательность цифр и преобразуем её в целое число. Число запоминаем в переменной n.
- n / 10 — число десятков в числе. Десятков будет в десять раз меньше чем само число. Выполняется целочисленное деление — деление нацело.
- n< % 10 — вычисляем остаток от деления на десять — число единиц — самая правая цифра числа.
- n / 10 + " " + n % 10 — вставляем между двумя целыми строку из одного пробела. В этом случае числа также преобразуются в строковое представление и все три строки сливаются — называется конкатенация строк. Так работает со строковыми данными операция «+».
Ускоряем ввод/вывод
При всем удобстве указанного подхода он довольно медленный и иногда задачи не заходят по времени. Значительно ускорить работу можно использовав
StreamTokenizer и
PrintWriter.
Это увеличит объем кода, но сэкономит время.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.io.*; import java.util.*; class Main { static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static PrintWriter out = new PrintWriter(System.out); static int nextInt() throws IOException { in.nextToken(); return (int)in.nval; } public static void main(String[] args) throws java.lang.Exception { int n = nextInt(); out.println(n / 10 + " " + n % 10); out.flush(); } } |
Возможно, стоит посмотреть на этот шаблон для решений.
Далее
Попробуйте найти все цифры трёхзначного числа.
Если удалось справиться с трёхзначным числом, решаем задачи из категории Линейные алгоритмы. Как можно больше. Даже если все кажется понятным. Тем более если все кажется понятным. Нам ведь нужно уметь писать программы, а не понимать как это делается. Тем более, что в каждой задаче вероятно придется выяснить что-то новенькое для себя.