diff --git a/input/T02.md b/input/T02.md new file mode 100644 index 0000000..ee40dab --- /dev/null +++ b/input/T02.md @@ -0,0 +1,380 @@ +# Целые числа в Java: теория и практика + +## 1. Что такое целые числа и зачем они нужны + +**Целое число** — это число без дробной части: ..., −3, −2, −1, 0, 1, 2, 3, ... + +В программировании целые числа используются для: +- счёта объектов (количество учеников, итераций цикла); +- индексов массивов и коллекций; +- идентификаторов (номер заказа, ID пользователя); +- работы с денежными суммами в копейках/центах (чтобы избежать ошибок округления); +- битовых операций и работы с памятью. + +> ⚠️ **Важно:** в Java нельзя хранить в целочисленной переменной дробное значение — компилятор выдаст ошибку или потребует явного приведения. + +--- + +## 2. Примитивные целочисленные типы + +В Java **4 примитивных целочисленных типа**, различающихся диапазоном и объёмом памяти: + +| Тип | Размер | Диапазон | Применение | +|-----|--------|----------|------------| +| `byte` | 8 бит | от −128 до 127 | экономия памяти в массивах, работа с байтами | +| `short` | 16 бит | от −32 768 до 32 767 | редко, в основном в устаревшем коде | +| `int` | 32 бита | от −2 147 483 648 до 2 147 483 647 | **основной тип по умолчанию** | +| `long` | 64 бита | от −9.2·10¹⁸ до 9.2·10¹⁸ | большие числа, время в миллисекундах | + +**Запомните:** по умолчанию любое целое литеральное число в Java имеет тип `int`. Чтобы получить `long`, добавьте суффикс `L`: + +```java +int a = 2_000_000_000; // ок +long b = 9_000_000_000L; // без L будет ошибка компиляции +``` + +--- + +## 3. Объявление переменных и литералы + +```java +byte small = 100; +short medium = 30_000; +int normal = 1_000_000; +long big = 123_456_789_012L; + +// Системы счисления: +int decimal = 255; // 10-я +int hex = 0xFF; // 16-я (префикс 0x) +int binary = 0b1111_1111; // 2-я (префикс 0b) +int octal = 0377; // 8-я (ведущий 0) + +// Подчёркивания для читаемости +int million = 1_000_000; +``` + +**Константы** (`final`) — значение нельзя изменить после инициализации: + +```java +final int MAX_SCORE = 100; +// MAX_SCORE = 200; // ошибка компиляции +``` + +--- + +## 4. Ввод целых чисел (класс `Scanner`) + +Самый простой способ — `java.util.Scanner`. + +```java +import java.util.Scanner; + +public class InputDemo { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + + System.out.print("Введите целое число: "); + int n = sc.nextInt(); // читает int + + System.out.print("Введите длинное число: "); + long L = sc.nextLong(); // читает long + + System.out.print("Введите байт: "); + byte b = sc.nextByte(); + + System.out.println(String.format("Вы ввели: %d, %d, %d", n, L, b)); + sc.close(); + } +} +``` + +Для чтения из файла/строки можно использовать `Scanner(new File("input.txt"))` или `BufferedReader`. + +--- + +## 5. Вывод целых чисел + +```java +int x = 42; + +// Если нужно вывести только число — подходит обычный println: +System.out.println(x); // 42 + +// Когда нужен текст или форматирование — String.format: +System.out.println(String.format("x = %d", x)); + +// Форматирование в разных системах счисления: +System.out.println(String.format("hex = %x, bin = %s", + 255, Integer.toBinaryString(255))); +// hex = ff, bin = 11111111 + +// Выравнивание и ширина поля: +System.out.println(String.format("|%5d|", 42)); // | 42| +System.out.println(String.format("|%-5d|", 42)); // |42 | +System.out.println(String.format("|%05d|", 42)); // |00042| +``` + +Часто используемые спецификаторы `String.format`: + +| Спецификатор | Смысл | +|--------------|-------| +| `%d` | целое в 10-й системе | +| `%x` | 16-я система | +| `%o` | 8-я система | +| `%05d` | целое с ведущими нулями, ширина 5 | +| `%n` | перевод строки (переносимый) | + +--- + +## 6. Основные операции + +### 6.1 Арифметические + +```java +int a = 17, b = 5; +System.out.println(a + b); // 22 +System.out.println(a - b); // 12 +System.out.println(a * b); // 85 +System.out.println(a / b); // 3 — ЦЕЛОЧИСЛЕННОЕ деление +System.out.println(a % b); // 2 — остаток от деления +``` + +> ⚠️ Деление целых чисел **отбрасывает дробную часть**, а не округляет: `7 / 2 == 3`, `-7 / 2 == -3` (округление к нулю). + +### 6.2 Операции присваивания + +```java +int x = 10; +x += 5; // x = 15 +x -= 3; // x = 12 +x *= 2; // x = 24 +x /= 4; // x = 6 +x %= 4; // x = 2 +x++; // x = 3 +x--; // x = 2 +``` + +### 6.3 Сравнение + +```java +int p = 5, q = 7; +boolean r1 = p == q; // false +boolean r2 = p != q; // true +boolean r3 = p < q; // true +boolean r4 = p >= q; // false +``` + +### 6.4 Побитовые операции + +```java +int m = 0b1100; // 12 +int n = 0b1010; // 10 +System.out.println(m & n); // 8 +System.out.println(m | n); // 14 +System.out.println(m ^ n); // 6 +System.out.println(~m); // -13 +System.out.println(m << 1); // 24 (сдвиг влево = ×2) +System.out.println(m >> 1); // 6 (сдвиг вправо) +System.out.println(m >>> 1); // 6 (беззнаковый сдвиг) +``` + +### 6.5 Приведение типов + +**Автоматическое** (расширяющее) — от меньшего к большему: + +```java +byte b = 100; +int i = b; // ок +long l = i; // ок +``` + +**Явное** (сужающее) — от большего к меньшему, возможна потеря данных: + +```java +int big = 300; +byte small = (byte) big; // 300 % 256 = 44 (переполнение) +``` + +**Переполнение** — опасная ситуация: `int` не может выйти за пределы диапазона и «зацикливается»: + +```java +int max = Integer.MAX_VALUE; +System.out.println(max + 1); // -2147483648 +``` + +--- + +## 7. Критерии применимости целых чисел + +Используйте целочисленный тип, если: + +1. **Величина по своей природе дискретна** — количество, индекс, счётчик. +2. **Нужна точность без округлений** — деньги (лучше в копейках), ID, временные метки. +3. **Выполняются операции над целыми** — деление нацело, остаток, битовые сдвиги. +4. **Важна производительность** — целочисленная арифметика быстрее вещественной. +5. **Нужна экономия памяти** — например, `byte[]` для большого массива. + +**Не используйте целые числа**, если: + +- величина непрерывна (расстояние, температура, вес) — берите `double`/`float`; +- нужна высокая точность над дробными числами — `BigDecimal`. + +**Выбор типа:** + +- по умолчанию — `int`; +- если значения > 2·10⁹ или работа со временем в мс — `long`; +- для больших массивов малых чисел — `byte`/`short`; +- для чисел, не помещающихся ни в один примитив (> 9.2·10¹⁸) — `BigInteger`. + +--- + +## 8. Классы стандартной библиотеки + +### 8.1 Классы-обёртки: `Integer`, `Long`, `Short`, `Byte` + +Каждому примитиву соответствует класс-обёртка. Нужен для: + +- хранения в коллекциях (`ArrayList`); +- использования полезных методов; +- `null`-значений (например, «значение отсутствует»). + +```java +Integer obj = 42; // автоупаковка (autoboxing) +int prim = obj; // автораспаковка (unboxing) + +// Полезные методы (там, где выводится только число — println): +System.out.println(Integer.MAX_VALUE); // 2147483647 +System.out.println(Integer.MIN_VALUE); // -2147483648 +System.out.println(Integer.parseInt("123")); // 123 +System.out.println(Integer.compare(3, 5)); // -1 +System.out.println(Integer.max(3, 5)); // 5 +System.out.println(Integer.sum(3, 5)); // 8 +System.out.println(Integer.bitCount(7)); // 3 +System.out.println(Integer.numberOfLeadingZeros(1)); // 31 + +// Там, где результат — строка — String.format: +System.out.println(String.format("%s", Integer.toBinaryString(10))); // 1010 +System.out.println(String.format("%s", Integer.toHexString(255))); // ff +``` + +> ⚠️ Сравнивайте объекты-обёртки через `.equals()`, а не `==`: +> ```java +> Integer a = 1000, b = 1000; +> System.out.println(a == b); // false (разные объекты) +> System.out.println(a.equals(b)); // true +> ``` +> Кэш `Integer` работает только для значений от −128 до 127, поэтому `Integer a = 100; Integer b = 100; a == b` даст `true`, но для 1000 — уже `false`. + +### 8.2 `BigInteger` — для чисел произвольной длины + +Когда `long` недостаточно (факториалы, криптография, длинная арифметика): + +```java +import java.math.BigInteger; + +BigInteger a = new BigInteger("123456789012345678901234567890"); +BigInteger b = BigInteger.valueOf(987654321L); + +System.out.println(a.add(b)); // сложение +System.out.println(a.subtract(b)); // вычитание +System.out.println(a.multiply(b)); // умножение +System.out.println(a.divide(b)); // деление +System.out.println(a.mod(b)); // остаток +System.out.println(a.pow(2)); // возведение в степень +System.out.println(a.gcd(b)); // НОД + +// Факториал 100: +BigInteger fact = BigInteger.ONE; +for (int i = 2; i <= 100; i++) + fact = fact.multiply(BigInteger.valueOf(i)); +System.out.println(fact); +``` + +`BigInteger` **иммутабелен** — операции возвращают новый объект, а не меняют исходный. + +### 8.3 `Math` — математические функции + +Работает с `double`, но есть методы и для целых: + +```java +System.out.println(Math.abs(-7)); // 7 +System.out.println(Math.max(3, 8)); // 8 +System.out.println(Math.min(3, 8)); // 3 + +// Math.pow / Math.sqrt возвращают double — для форматирования используем String.format: +System.out.println(String.format("%.1f", Math.pow(2, 10))); // 1024.0 +System.out.println(String.format("%.1f", Math.sqrt(144))); // 12.0 +``` + +### 8.4 `Random` — генерация случайных чисел + +```java +import java.util.Random; + +Random rnd = new Random(); +int r1 = rnd.nextInt(); // любое int +int r2 = rnd.nextInt(100); // [0, 100) +int r3 = rnd.nextInt(50) + 1; // [1, 50] + +System.out.println(r2); +System.out.println(r3); + +// Начиная с Java 17 — RandomGenerator: +// int r = java.util.random.RandomGenerator.getDefault().nextInt(1, 101); +``` + +--- + +## 9. Мини-пример: сумма цифр числа + +```java +import java.util.Scanner; + +public class SumDigits { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.print("Введите целое число: "); + long n = Math.abs(sc.nextLong()); + + int sum = 0; + while (n > 0) { + sum += (int)(n % 10); // последняя цифра + n /= 10; // отбрасываем её + } + System.out.println(sum); + } +} +``` + +Здесь задействованы: `long`, `%` и `/`, приведение типов, ввод/вывод, `Math.abs`. + +--- + +## 10. Типичные ошибки + +| Ошибка | Как избежать | +|--------|--------------| +| Деление нацело вместо дробного | Привести один операнд: `(double) a / b` | +| Переполнение `int` | Использовать `long` или `Math.addExact` (бросает исключение) | +| Сравнение обёрток через `==` | Использовать `.equals()` | +| Забыть `L` у большого литерала | `long x = 3000000000L;` | +| `NullPointerException` при распаковке | Проверять на `null` перед присваиванием в примитив | +| Потеря точности при `(int) longValue` | Проверять диапазон или использовать `Math.toIntExact` | + +```java +// Безопасные операции (Java 8+): +int sum = Math.addExact(1_000_000_000, 1_000_000_000); // ArithmeticException +int prod = Math.multiplyExact(100_000, 100_000); // исключение +``` + +--- + +## 11. Итоги + +- В Java 4 примитивных целочисленных типа; основной — `int`, для больших значений — `long`. +- По умолчанию целые литералы — `int`, для `long` нужен суффикс `L`. +- Деление целых **отбрасывает** дробную часть, остаток даёт `%`. +- Для чисел > 9.2·10¹⁸ используйте `BigInteger`. +- Для коллекций и `null` — классы-обёртки (`Integer`, `Long`, ...). +- Всегда проверяйте возможность **переполнения** и корректность приведения типов. + diff --git a/input/problems.html b/input/problems.html new file mode 100644 index 0000000..5fea9c9 --- /dev/null +++ b/input/problems.html @@ -0,0 +1,267 @@ +

10 задач по теме «Целые +числа» на Java

+

Все решения используют только арифметические операторы +(+, -, *, /, +%) и стандартный ввод/вывод. Без if, +for, while, switch и без создания +собственных функций.

+
+

Задача 1. +Сумма и произведение цифр двузначного числа

+

Условие: Дано двузначное число. Найти сумму и +произведение его цифр.

+ + + + + + + + + + + + + +
Ввод:Вывод:
4711 28
+

Решение:

+
import java.util.Scanner;
+
+public class Task1 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int n = sc.nextInt();
+        int a = n / 10;
+        int b = n % 10;
+        System.out.println(a + b);
+        System.out.println(a * b);
+    }
+}
+
+

Задача 2. Число, обратное +двузначному

+

Условие: Дано двузначное число. Получить число, +записанное теми же цифрами в обратном порядке.

+ + + + + + + + + + + + + +
Ввод:Вывод:
4774
+

Решение:

+
import java.util.Scanner;
+
+public class Task2 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int n = sc.nextInt();
+        int result = (n % 10) * 10 + (n / 10);
+        System.out.println(result);
+    }
+}
+
+

Задача 3. Сумма цифр +трёхзначного числа

+

Условие: Дано трёхзначное число. Найти сумму его +цифр.

+ + + + + + + + + + + + + +
Ввод:Вывод:
38516
+

Решение:

+
import java.util.Scanner;
+
+public class Task3 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int n = sc.nextInt();
+        int sum = n / 100 + (n / 10) % 10 + n % 10;
+        System.out.println(sum);
+    }
+}
+
+

Задача 4. +Перевод секунд в часы, минуты и секунды

+

Условие: Дано целое число секунд t. +Перевести в часы, минуты и секунды.

+ + + + + + + + + + + + + +
Ввод:Вывод:
72652 1 5
+

Решение:

+
import java.util.Scanner;
+
+public class Task4 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int t = sc.nextInt();
+        int h = t / 3600;
+        int m = (t % 3600) / 60;
+        int s = t % 60;
+        System.out.println(h);
+        System.out.println(m);
+        System.out.println(s);
+    }
+}
+
+

Задача 5. Последняя +цифра числа в степени

+

Условие: Дано число n. Найти последнюю +цифру числа n².

+ + + + + + + + + + + + + +
Ввод:Вывод:
37
+

Решение:

+
import java.util.Scanner;
+
+public class Task5 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int n = sc.nextInt();
+        int last = n % 10;
+        System.out.println((last * last * last * last) % 10);
+    }
+}
+
+

Задача 7. +Обмен цифр трёхзначного числа (циклический сдвиг)

+

Условие: Дано трёхзначное число abc. +Получить число bca (первую цифру в конец).

+ + + + + + + + + + + + + +
Ввод:Вывод:
385853
+

Решение:

+
import java.util.Scanner;
+
+public class Task7 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int n = sc.nextInt();
+        int a = n / 100;
+        int b = (n / 10) % 10;
+        int c = n % 10;
+        int result = b * 100 + c * 10 + a;
+        System.out.println(result);
+    }
+}
+
+

Задача 8. Сумма цифр +четырёхзначного числа

+

Условие: Дано четырёхзначное число. Найти сумму его +цифр.

+ + + + + + + + + + + + + +
Ввод:Вывод:
123410
+

Решение:

+
import java.util.Scanner;
+
+public class Task8 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int n = sc.nextInt();
+        int sum = n / 1000 + (n / 100) % 10 + (n / 10) % 10 + n % 10;
+        System.out.println(sum);
+    }
+}
+
+

Задача 9. Количество +полных минут в сутках

+

Условие: Дано число минут m. Найти +количество полных суток и остаток минут.

+ + + + + + + + + + + + + +
Ввод:Вывод:
50003 680
+

Решение:

+
import java.util.Scanner;
+
+public class Task9 {
+    public static void main(String[] args) {
+        Scanner sc = new Scanner(System.in);
+        int m = sc.nextInt();
+        int days = m / 1440;
+        int rest = m % 1440;
+        System.out.println(days);
+        System.out.println(rest);
+    }
+}
diff --git a/input/problems.md b/input/problems.md new file mode 100644 index 0000000..b9e62c6 --- /dev/null +++ b/input/problems.md @@ -0,0 +1,210 @@ +# 10 задач по теме «Целые числа» на Java + +Все решения используют только арифметические операторы (`+`, `-`, `*`, `/`, `%`) и стандартный ввод/вывод. Без `if`, `for`, `while`, `switch` и без создания собственных функций. + +--- + +## Задача 1. Сумма и произведение цифр двузначного числа + +**Условие:** Дано двузначное число. Найти сумму и произведение его цифр. + +|**Ввод:** |**Вывод:**| +|--|--| +| 47 | 11 28 | + +**Решение:** +```java +import java.util.Scanner; + +public class Task1 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int a = n / 10; + int b = n % 10; + System.out.println(a + b); + System.out.println(a * b); + } +} +``` + +--- + +## Задача 2. Число, обратное двузначному + +**Условие:** Дано двузначное число. Получить число, записанное теми же цифрами в обратном порядке. + +|**Ввод:** |**Вывод:**| +|--|--| +| 47 | 74 | + + +**Решение:** +```java +import java.util.Scanner; + +public class Task2 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int result = (n % 10) * 10 + (n / 10); + System.out.println(result); + } +} +``` + +--- + +## Задача 3. Сумма цифр трёхзначного числа + +**Условие:** Дано трёхзначное число. Найти сумму его цифр. + +|**Ввод:** |**Вывод:**| +|--|--| +| 385 | 16 | + +**Решение:** +```java +import java.util.Scanner; + +public class Task3 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int sum = n / 100 + (n / 10) % 10 + n % 10; + System.out.println(sum); + } +} +``` + +--- + +## Задача 4. Перевод секунд в часы, минуты и секунды + +**Условие:** Дано целое число секунд `t`. Перевести в часы, минуты и секунды. + +|**Ввод:** |**Вывод:**| +|--|--| +| 7265 | 2 1 5 | + + +**Решение:** +```java +import java.util.Scanner; + +public class Task4 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int t = sc.nextInt(); + int h = t / 3600; + int m = (t % 3600) / 60; + int s = t % 60; + System.out.println(h); + System.out.println(m); + System.out.println(s); + } +} +``` + +--- + +## Задача 5. Последняя цифра числа в степени + +**Условие:** Дано число `n`. Найти последнюю цифру числа `n²`. + +|**Ввод:** |**Вывод:**| +|--|--| +| 37 | | + +**Решение:** +```java +import java.util.Scanner; + +public class Task5 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int last = n % 10; + System.out.println((last * last * last * last) % 10); + } +} +``` + +--- + +## Задача 7. Обмен цифр трёхзначного числа (циклический сдвиг) + +**Условие:** Дано трёхзначное число `abc`. Получить число `bca` (первую цифру в конец). + +|**Ввод:** |**Вывод:**| +|--|--| +| 385 | 853 | + +**Решение:** +```java +import java.util.Scanner; + +public class Task7 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int a = n / 100; + int b = (n / 10) % 10; + int c = n % 10; + int result = b * 100 + c * 10 + a; + System.out.println(result); + } +} +``` + +--- + +## Задача 8. Сумма цифр четырёхзначного числа + +**Условие:** Дано четырёхзначное число. Найти сумму его цифр. + +|**Ввод:** |**Вывод:**| +|--|--| +| 1234 | 10 | + +**Решение:** +```java +import java.util.Scanner; + +public class Task8 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int sum = n / 1000 + (n / 100) % 10 + (n / 10) % 10 + n % 10; + System.out.println(sum); + } +} +``` + +--- + +## Задача 9. Количество полных минут в сутках + +**Условие:** Дано число минут `m`. Найти количество полных суток и остаток минут. + +|**Ввод:** |**Вывод:**| +|--|--| +| 5000 | 3 680 | + +**Решение:** +```java +import java.util.Scanner; + +public class Task9 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int m = sc.nextInt(); + int days = m / 1440; + int rest = m % 1440; + System.out.println(days); + System.out.println(rest); + } +} +``` + + diff --git a/input/problems.txt b/input/problems.txt new file mode 100644 index 0000000..8f0b0f3 --- /dev/null +++ b/input/problems.txt @@ -0,0 +1,220 @@ +# 10 задач по теме «Целые числа» на Java + +Все решения используют только арифметические операторы (`+`, `-`, `*`, +`/`, `%`) и стандартный ввод/вывод. Без `if`, `for`, `while`, `switch` и +без создания собственных функций. + +------------------------------------------------------------------------ + +## Задача 1. Сумма и произведение цифр двузначного числа + +**Условие:** Дано двузначное число. Найти сумму и произведение его цифр. + + **Ввод:** **Вывод:** + ----------- ------------ + 47 11 28 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task1 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int a = n / 10; + int b = n % 10; + System.out.println(a + b); + System.out.println(a * b); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 2. Число, обратное двузначному + +**Условие:** Дано двузначное число. Получить число, записанное теми же +цифрами в обратном порядке. + + **Ввод:** **Вывод:** + ----------- ------------ + 47 74 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task2 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int result = (n % 10) * 10 + (n / 10); + System.out.println(result); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 3. Сумма цифр трёхзначного числа + +**Условие:** Дано трёхзначное число. Найти сумму его цифр. + + **Ввод:** **Вывод:** + ----------- ------------ + 385 16 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task3 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int sum = n / 100 + (n / 10) % 10 + n % 10; + System.out.println(sum); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 4. Перевод секунд в часы, минуты и секунды + +**Условие:** Дано целое число секунд `t`. Перевести в часы, минуты и +секунды. + + **Ввод:** **Вывод:** + ----------- ------------ + 7265 2 1 5 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task4 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int t = sc.nextInt(); + int h = t / 3600; + int m = (t % 3600) / 60; + int s = t % 60; + System.out.println(h); + System.out.println(m); + System.out.println(s); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 5. Последняя цифра числа в степени + +**Условие:** Дано число `n`. Найти последнюю цифру числа `n²`. + + **Ввод:** **Вывод:** + ----------- ------------ + 37 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task5 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int last = n % 10; + System.out.println((last * last * last * last) % 10); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 7. Обмен цифр трёхзначного числа (циклический сдвиг) + +**Условие:** Дано трёхзначное число `abc`. Получить число `bca` (первую +цифру в конец). + + **Ввод:** **Вывод:** + ----------- ------------ + 385 853 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task7 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int a = n / 100; + int b = (n / 10) % 10; + int c = n % 10; + int result = b * 100 + c * 10 + a; + System.out.println(result); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 8. Сумма цифр четырёхзначного числа + +**Условие:** Дано четырёхзначное число. Найти сумму его цифр. + + **Ввод:** **Вывод:** + ----------- ------------ + 1234 10 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task8 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int sum = n / 1000 + (n / 100) % 10 + (n / 10) % 10 + n % 10; + System.out.println(sum); + } +} +``` + +------------------------------------------------------------------------ + +## Задача 9. Количество полных минут в сутках + +**Условие:** Дано число минут `m`. Найти количество полных суток и +остаток минут. + + **Ввод:** **Вывод:** + ----------- ------------ + 5000 3 680 + +**Решение:** + +``` java +import java.util.Scanner; + +public class Task9 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int m = sc.nextInt(); + int days = m / 1440; + int rest = m % 1440; + System.out.println(days); + System.out.println(rest); + } +} +``` diff --git a/input/problems.xml b/input/problems.xml new file mode 100644 index 0000000..740d3fd --- /dev/null +++ b/input/problems.xml @@ -0,0 +1,377 @@ + + + + +
10 задач по теме «Целые числа» на Java
+Все решения используют только арифметические операторы (+, -, *, /, %) и стандартный ввод/вывод. Без if, for, while, switch и без создания собственных функций. + +
Задача 1. Сумма и произведение цифр двузначного числа
+Условие: Дано двузначное число. Найти сумму и произведение его цифр. + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +47 + + +11 28 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task1 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int a = n / 10; + int b = n % 10; + System.out.println(a + b); + System.out.println(a * b); + } +} + +
Задача 2. Число, обратное двузначному
+Условие: Дано двузначное число. Получить число, записанное теми же цифрами в обратном порядке. + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +47 + + +74 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task2 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int result = (n % 10) * 10 + (n / 10); + System.out.println(result); + } +} + +
Задача 3. Сумма цифр трёхзначного числа
+Условие: Дано трёхзначное число. Найти сумму его цифр. + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +385 + + +16 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task3 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int sum = n / 100 + (n / 10) % 10 + n % 10; + System.out.println(sum); + } +} + +
Задача 4. Перевод секунд в часы, минуты и секунды
+Условие: Дано целое число секунд t. Перевести в часы, минуты и секунды. + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +7265 + + +2 1 5 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task4 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int t = sc.nextInt(); + int h = t / 3600; + int m = (t % 3600) / 60; + int s = t % 60; + System.out.println(h); + System.out.println(m); + System.out.println(s); + } +} + +
Задача 5. Последняя цифра числа в степени
+Условие: Дано число n. Найти последнюю цифру числа n². + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +37 + + + + + + +
+Решение: +import java.util.Scanner; + +public class Task5 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int last = n % 10; + System.out.println((last * last * last * last) % 10); + } +} + +
Задача 7. Обмен цифр трёхзначного числа (циклический сдвиг)
+Условие: Дано трёхзначное число abc. Получить число bca (первую цифру в конец). + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +385 + + +853 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task7 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int a = n / 100; + int b = (n / 10) % 10; + int c = n % 10; + int result = b * 100 + c * 10 + a; + System.out.println(result); + } +} + +
Задача 8. Сумма цифр четырёхзначного числа
+Условие: Дано четырёхзначное число. Найти сумму его цифр. + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +1234 + + +10 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task8 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + int sum = n / 1000 + (n / 100) % 10 + (n / 10) % 10 + n % 10; + System.out.println(sum); + } +} + +
Задача 9. Количество полных минут в сутках
+Условие: Дано число минут m. Найти количество полных суток и остаток минут. + +
+ + + + + + + +Ввод: + + +Вывод: + + + + +
+ + + +5000 + + +3 680 + + + + + +
+Решение: +import java.util.Scanner; + +public class Task9 { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int m = sc.nextInt(); + int days = m / 1440; + int rest = m % 1440; + System.out.println(days); + System.out.println(rest); + } +} +
+
diff --git a/input/problems2.md b/input/problems2.md new file mode 100644 index 0000000..6329a70 --- /dev/null +++ b/input/problems2.md @@ -0,0 +1,175 @@ +# Задачи по побитовым операциям на Java + +> **Условие:** без использования операторов выбора (`if`, `switch`, `?:`), циклов (`for`, `while`, `do`) и объявления новых функций. Только `main`, побитовые операции, арифметика и `System.out.println`. + +--- + +## Задача 1. Умножить число на 4 без умножения + +**Условие:** Дано целое число `n`. Получить `n * 4`, используя только побитовые операции. + +|**Ввод:** |**Вывод:**| +|--|--| +| 5 | 20 | + +**Решение:** +```java +public class Task1 { + public static void main(String[] args) { + int n = 5; + int result = n << 2; // сдвиг влево на 2 = умножение на 4 + System.out.println(result); + } +} +``` + +--- + +## Задача 2. Разделить число на 2 без деления + +**Условие:** Дано целое число `n`. Получить `n / 2`, используя только побитовые операции. + +|**Ввод:** |**Вывод:**| +|--|--| +| 20 | 10 | + +**Решение:** +```java +public class Task2 { + public static void main(String[] args) { + int n = 20; + int result = n >> 1; // сдвиг вправо на 1 = деление на 2 + System.out.println(result); + } +} +``` + +--- + +## Задача 3. Проверить, чётное ли число + +**Условие:** Дано целое число `n`. Вывести `1`, если оно чётное, и `0`, если нечётное. + +|**Ввод:** |**Вывод:**| +|--|--| +| 7 | 0 | + +**Решение:** +```java +public class Task3 { + public static void main(String[] args) { + int n = 7; + int result = (n & 1) ^ 1; // если младший бит 1 → 0, иначе → 1 + System.out.println(result); + } +} +``` + +--- + +## Задача 4. Обнулить младший бит + +**Условие:** Дано целое число `n`. Обнулить его самый младший установленный бит. + +|**Ввод:** |**Вывод:**| +|--|--| +| 12 | 8 | + +**Решение:** +```java +public class Task4 { + public static void main(String[] args) { + int n = 12; + int result = n & (n - 1); // трюк: убирает младший установленный бит + System.out.println(result); + } +} +``` + +--- + +## Задача 5. Установить k-й бит в 1 + +**Условие:** Даны число `n` и позиция `k` (нумерация с 0). Установить `k`-й бит в 1. + +|**Ввод:** |**Вывод:**| +|--|--| +| 8 2 | 12 | + + +**Решение:** +```java +public class Task6 { + public static void main(String[] args) { + int n = 8; // 1000 + int k = 2; + int result = n | (1 << k); // 1000 | 0100 = 1100 = 12 + System.out.println(result); + } +} +``` + +--- + +## Задача 6. Инвертировать k-й бит + +**Условие:** Даны число `n` и позиция `k`. Инвертировать `k`-й бит. + +|**Ввод:** |**Вывод:**| +|--|--| +| 10 1 | 8 | + +**Решение:** +```java +public class Task7 { + public static void main(String[] args) { + int n = 10; // 1010 + int k = 1; + int result = n ^ (1 << k); // 1010 ^ 0010 = 1000 = 8 + System.out.println(result); + } +} +``` + +--- + +## Задача 7. Умножить число на 5 без умножения + +**Условие:** Дано целое число `n`. Получить `n * 5`, используя только сдвиги и сложение. + +|**Ввод:** |**Вывод:**| +|--|--| +| 7 | 35 | + +**Решение:** +```java +public class Task10 { + public static void main(String[] args) { + int n = 7; + int result = (n << 2) + n; // 4n + n = 5n + System.out.println(result); + } +} +``` + +--- + +## Задача 8. Умножить число на 3 без умножения + +**Условие:** Дано целое число `n`. Получить `n * 3`, используя только сдвиги и сложение. + +|**Ввод:** |**Вывод:**| +|--|--| +| 7 | 21 | + +**Решение:** +```java +public class Task10 { + public static void main(String[] args) { + int n = 7; + int result = (n << 1) + n; // 2n + n = 3n + System.out.println(result); + } +} +``` + diff --git a/justfile b/justfile index cb912ec..f94c74e 100644 --- a/justfile +++ b/justfile @@ -5,4 +5,10 @@ root := justfile_directory() [working-directory: 'src/tasks_to_mdl'] xml-to-dataclasses: - uv run xsdata generate --package gen --include-header {{ root }}/input/nothing.xml + uv run xsdata generate --package mdl --include-header {{ root }}/input/nothing.xml + +[working-directory: 'src/tasks_to_mdl'] +pandoc-to-dataclasses: + uv run xsdata generate --package pandoc --include-header {{ root }}/input/problems.xml + +gen-dataclasses: pandoc-to-dataclasses xml-to-dataclasses diff --git a/src/tasks_to_mdl/gen/__init__.py b/src/tasks_to_mdl/mdl/__init__.py similarity index 82% rename from src/tasks_to_mdl/gen/__init__.py rename to src/tasks_to_mdl/mdl/__init__.py index c8fe632..3e1e5c4 100644 --- a/src/tasks_to_mdl/gen/__init__.py +++ b/src/tasks_to_mdl/mdl/__init__.py @@ -1,10 +1,10 @@ -"""This file was generated by xsdata, v26.2, on 2026-09-14 16:00:22 +"""This file was generated by xsdata, v26.2, on 2026-09-14 19:25:20 Generator: DataclassGenerator See: https://xsdata.readthedocs.io/ """ -from gen.quiz import ( +from mdl.quiz import ( Display, Expected, Extra, diff --git a/src/tasks_to_mdl/gen/quiz.py b/src/tasks_to_mdl/mdl/quiz.py similarity index 99% rename from src/tasks_to_mdl/gen/quiz.py rename to src/tasks_to_mdl/mdl/quiz.py index cd6d599..0e83e2f 100644 --- a/src/tasks_to_mdl/gen/quiz.py +++ b/src/tasks_to_mdl/mdl/quiz.py @@ -1,4 +1,4 @@ -"""This file was generated by xsdata, v26.2, on 2026-09-14 16:00:22 +"""This file was generated by xsdata, v26.2, on 2026-09-14 19:25:20 Generator: DataclassGenerator See: https://xsdata.readthedocs.io/ diff --git a/src/tasks_to_mdl/pandoc/__init__.py b/src/tasks_to_mdl/pandoc/__init__.py new file mode 100644 index 0000000..1553de6 --- /dev/null +++ b/src/tasks_to_mdl/pandoc/__init__.py @@ -0,0 +1,39 @@ +"""This file was generated by xsdata, v26.2, on 2026-09-14 19:25:20 + +Generator: DataclassGenerator +See: https://xsdata.readthedocs.io/ +""" + +from pandoc.pandoc import ( + Blocks, + Body, + Cell, + CodeBlock, + ColSpec, + Colspecs, + Header, + Pandoc, + Para, + Plain, + Row, + Table, + TableBody, + TableHead, +) + +__all__ = [ + "Cell", + "CodeBlock", + "ColSpec", + "Header", + "Pandoc", + "Para", + "Plain", + "Row", + "Table", + "TableBody", + "TableHead", + "Blocks", + "Body", + "Colspecs", +] diff --git a/src/tasks_to_mdl/pandoc/pandoc.py b/src/tasks_to_mdl/pandoc/pandoc.py new file mode 100644 index 0000000..f9f10e4 --- /dev/null +++ b/src/tasks_to_mdl/pandoc/pandoc.py @@ -0,0 +1,293 @@ +"""This file was generated by xsdata, v26.2, on 2026-09-14 19:25:20 + +Generator: DataclassGenerator +See: https://xsdata.readthedocs.io/ +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import ForwardRef + + +@dataclass(kw_only=True) +class CodeBlock: + class_value: str = field( + metadata={ + "name": "class", + "type": "Attribute", + } + ) + value: str = field(default="") + + +@dataclass(kw_only=True) +class ColSpec: + alignment: str = field( + metadata={ + "type": "Attribute", + } + ) + col_width: int = field( + metadata={ + "name": "col-width", + "type": "Attribute", + } + ) + + +@dataclass(kw_only=True) +class Header: + id: str = field( + metadata={ + "type": "Attribute", + } + ) + level: int = field( + metadata={ + "type": "Attribute", + } + ) + value: str = field(default="") + + +@dataclass(kw_only=True) +class Para: + content: list[object] = field( + default_factory=list, + metadata={ + "type": "Wildcard", + "namespace": "##any", + "mixed": True, + "choices": ( + { + "name": "Strong", + "type": ForwardRef("Para.Strong"), + }, + { + "name": "Code", + "type": ForwardRef("Para.Code"), + }, + { + "type": ForwardRef("Para.Value"), + }, + ), + }, + ) + + @dataclass(kw_only=True) + class Strong: + value: str = field(default="") + + @dataclass(kw_only=True) + class Code: + value: str = field(default="") + + @dataclass(kw_only=True) + class Value: + value: str = field(default="") + + +@dataclass(kw_only=True) +class Plain: + strong: str = field( + metadata={ + "name": "Strong", + "type": "Element", + } + ) + + +@dataclass(kw_only=True) +class Cell: + alignment: str = field( + metadata={ + "type": "Attribute", + } + ) + plain: None | str | int | Plain = field( + default=None, + metadata={ + "name": "Plain", + "type": "Element", + }, + ) + + +@dataclass(kw_only=True) +class Colspecs: + class Meta: + name = "colspecs" + + col_spec: list[ColSpec] = field( + default_factory=list, + metadata={ + "name": "ColSpec", + "type": "Element", + "min_occurs": 1, + }, + ) + + +@dataclass(kw_only=True) +class Row: + cell: list[Cell] = field( + default_factory=list, + metadata={ + "name": "Cell", + "type": "Element", + "min_occurs": 1, + }, + ) + + +@dataclass(kw_only=True) +class TableHead: + row: Row = field( + metadata={ + "name": "Row", + "type": "Element", + } + ) + + +@dataclass(kw_only=True) +class Body: + class Meta: + name = "body" + + row: Row = field( + metadata={ + "name": "Row", + "type": "Element", + } + ) + + +@dataclass(kw_only=True) +class TableBody: + row_head_columns: int = field( + metadata={ + "name": "row-head-columns", + "type": "Attribute", + } + ) + header: None | object = field( + default=None, + metadata={ + "type": "Element", + }, + ) + body: Body = field( + metadata={ + "type": "Element", + } + ) + + +@dataclass(kw_only=True) +class Table: + caption: None | object = field( + default=None, + metadata={ + "name": "Caption", + "type": "Element", + }, + ) + colspecs: Colspecs = field( + metadata={ + "type": "Element", + } + ) + table_head: TableHead = field( + metadata={ + "name": "TableHead", + "type": "Element", + } + ) + table_body: TableBody = field( + metadata={ + "name": "TableBody", + "type": "Element", + } + ) + table_foot: None | object = field( + default=None, + metadata={ + "name": "TableFoot", + "type": "Element", + }, + ) + + +@dataclass(kw_only=True) +class Blocks: + class Meta: + name = "blocks" + + header: list[Header] = field( + default_factory=list, + metadata={ + "name": "Header", + "type": "Element", + "min_occurs": 1, + "sequence": 1, + }, + ) + para: list[Para] = field( + default_factory=list, + metadata={ + "name": "Para", + "type": "Element", + "min_occurs": 1, + "sequence": 1, + }, + ) + horizontal_rule: list[object] = field( + default_factory=list, + metadata={ + "name": "HorizontalRule", + "type": "Element", + "min_occurs": 1, + "sequence": 1, + }, + ) + table: list[Table] = field( + default_factory=list, + metadata={ + "name": "Table", + "type": "Element", + "min_occurs": 1, + "sequence": 1, + }, + ) + code_block: list[CodeBlock] = field( + default_factory=list, + metadata={ + "name": "CodeBlock", + "type": "Element", + "min_occurs": 1, + "sequence": 1, + }, + ) + + +@dataclass(kw_only=True) +class Pandoc: + api_version: str = field( + metadata={ + "name": "api-version", + "type": "Attribute", + } + ) + meta: None | object = field( + default=None, + metadata={ + "type": "Element", + }, + ) + blocks: Blocks = field( + metadata={ + "type": "Element", + } + )