Загрузка данных


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Введите год (например, 2026): ");
        int year = scanner.nextInt();

        System.out.print("Введите месяц (1-12): ");
        int month = scanner.nextInt();

        // 1. Проверяем високосность года
        boolean isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

        // 2. Определяем количество дней в выбранном месяце
        int[] daysInMonths = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (isLeap) {
            daysInMonths[2] = 29;
        }
        int daysInCurrentMonth = daysInMonths[month];

        // 3. Вычисляем день недели для 1-го числа (Алгоритм Сакамото)
        // 0 = Вс, 1 = Пн, 2 = Вт, 3 = Ср, 4 = Чт, 5 = Пт, 6 = Сб
        int y = year - (month < 3 ? 1 : 0);
        int[] t = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
        int dayOfWeek = (y + y / 4 - y / 100 + y / 400 + t[month - 1] + 1) % 7;

        // Переводим в привычный формат с понедельника: 0 = Пн, 1 = Вт, ..., 6 = Вс
        int startCol = (dayOfWeek + 6) % 7;

        // 4. Выводим заголовок сетки
        System.out.println("\n  Пн  Вт  Ср  Чт  Пт  Сб  Вс");

        // Отступ до первого дня месяца
        for (int i = 0; i < startCol; i++) {
            System.out.print("    ");
        }

        // Печать всех чисел месяца
        int currentCol = startCol;
        for (int day = 1; day <= daysInCurrentMonth; day++) {
            System.out.printf("%4d", day);
            currentCol++;

            // Переход на новую строку в конце недели (после воскресенья)
            if (currentCol % 7 == 0) {
                System.out.println();
            }
        }
        System.out.println();
        scanner.close();
    }
}