# Работа с данными типа: множество, дата, кортежи. ## Индивидуальное задание номер 12 "100!-2^100" ``` class Program { static void Main() { // Вычисление 100! BigInteger factorial = Factorial(100); // Вычисление 2^100 BigInteger powerOf2 = BigInteger.Pow(2, 100); // Вычисление разности BigInteger result = factorial - powerOf2; Console.WriteLine(result); } // Метод для вычисления факториала static BigInteger Factorial(int n) { if (n == 0 || n == 1) { return 1; } else { return n * Factorial(n - 1); } } } ``` ## Общие задания с датами. ### 1. Ввести с консоли строку в формате `ДД.ММ.ГГГГ`. Проверьте является ли введенная строка валидной датой. ``` Console.WriteLine("Введите дату: "); string date1 = Console.ReadLine(); DateTime date; if (DateTime.TryParse(date1, out date)) { Console.WriteLine("Введённая дата соответствует валидной дате. "); } else { Console.WriteLine("Введённая дата не соответствует валидной дате. "); } ``` ### 2. Найти количество дней между двумя датами. ``` DateTime date1 = new DateTime(2025, 10, 20); DateTime date2 = new DateTime(2024, 9, 30); TimeSpan difference = date1 - date2; int s = difference.Days; Console.WriteLine("Разница между датами в днях: " + s); ``` ### 3. Найти количество часов между двумя датами. ``` DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); DateTime date2 = new DateTime(2010, 5, 10, 13, 25, 45); TimeSpan difference = date1 - date2; int s = difference.Hours; Console.WriteLine("Разность между двумя датами в часах: " + s); ``` ### 4. Найти количество минут между двумя датами. ``` DateTime date1 = new DateTime(1998, 6, 9, 15, 45, 4); DateTime date2 = new DateTime(1961, 2, 1, 13, 13, 5); TimeSpan difference = date1 - date2; int s = difference.Minutes; Console.WriteLine("Разность между двумя датами в минутах: " + s); ``` ### 5. Найти "день программиста" (256-й день в году) для указанного года (ввести с консоли). Вывести дату и день недели. ``` Console.Write("Введите год: "); int year = Convert.ToInt16(Console.ReadLine()); DateTime date1 = new DateTime(year, 1, 1).AddDays(255); Console.WriteLine("День программиста: " + date1.ToShortDateString() + " (" + date1.DayOfWeek + ")"); ``` ### 6. Известен номер **n** некоторого дня года (1 ≤ n ≤ 365). Определить номер и название дня недели, на который выпадает данный день года. ``` Console.Write("Введите номер дня в году: "); int n = int.Parse(Console.ReadLine()); DateTime date = new DateTime(DateTime.Now.Year, 1, 1).AddDays(n - 1); Console.WriteLine("День недели: " + date.DayOfWeek + ", номер дня в году: " + date.DayOfYear); ``` ### 7. Задана дата экзамена. С клавиатуры надо вводить другую дату, в случае, если дата раньше даты экзамена, вывести "осталось n дней", если уже прошел экзамен "прошло n дней", и если экзамен сегодня "сегодня экзамен!" ``` Console.Write("Введите дату: "); DateTime date = new DateTime(2024,4, 30); DateTime date1 = DateTime.Parse(Console.ReadLine()); if (date > date1) { TimeSpan difference = date - date1; int s = difference.Days; Console.WriteLine("Осталось " + s + " дней до экзамена."); } else if (date < date1) { TimeSpan difference = date1 - date; int s = difference.Days; Console.WriteLine("Прошло " + s + " дней от экзамена."); } else { Console.WriteLine("Сегодня экзамен!"); } ``` ### 8. Вывести дату в формате `ДД.ММ.ГГГГ` для "завтра" ``` Console.Write("Введите дату: "); DateTime date1 = DateTime.Parse(Console.ReadLine()); date1 = date1.AddDays(1); Console.WriteLine("Завтра будет дата: " + date1.ToString("dd.MM.yyyy")); ``` ### 9. Задан день и месяц рождения в формате `dd.mm`. Определите, сколько дней осталось/прошло с дня рождения. Если сегодня - день рождения, то вывести поздравление. ``` Console.Write("Введите день и месяц рождения: "); DateTime date1 = DateTime.ParseExact(Console.ReadLine(), "dd.MM", null); DateTime date2 = DateTime.ParseExact(Console.ReadLine(), "dd.MM", null); if (date1 > date2) { TimeSpan difference = date1 - date2; int s = difference.Days; Console.WriteLine("Осталось " + s + " до дня рождения."); } else if (date1 < date2) { TimeSpan difference = date2 - date1; int s = difference.Days; Console.WriteLine("Прошло " + s + " дней со дня рождения."); } else { Console.WriteLine("Сегодня день рождения!"); } ``` ### 10. Часы показывают время в формате `hh:mm:ss`. Определите количество секунд, которое прошло с начала суток. ``` List Dates = new List { new DateTime(2017, 12,1), new DateTime(2018,1,2), new DateTime(2019,2,3), new DateTime(2020,3,4), new DateTime(2021,4,5), new DateTime(2022,5,6), new DateTime(2023,6,22), new DateTime(2023,12,31) }; DateTime today = DateTime.Today; DateTime date1 = Dates[0]; TimeSpan date2 = today - date1; foreach (DateTime date in Dates) { TimeSpan difference = today - date; if (Math.Abs(difference.Days) < Math.Abs(date2.Days)) { date2 = difference; date1 = date; } } Console.WriteLine("Ближайшая дата: " + date1.ToShortDateString()); ``` ### 11. Задан неупорядоченный список дат в формате `ДД.ММ.ГГГГ`, найти ближайшую (к сегодняшнему дню) дату из списка. ``` List Dates = new List { new DateTime(2017, 12,1), new DateTime(2018,1,2), new DateTime(2019,2,3), new DateTime(2020,3,4), new DateTime(2021,4,5), new DateTime(2022,5,6), new DateTime(2023,6,22), new DateTime(2023,12,31) }; DateTime today = DateTime.Today; DateTime date1 = Dates[0]; TimeSpan date2 = today - date1; foreach (DateTime date in Dates) { TimeSpan difference = today - date; if (Math.Abs(difference.Days) < Math.Abs(date2.Days)) { date2 = difference; date1 = date; } } Console.WriteLine("Ближайшая дата: " + date1.ToShortDateString()); ``` ### 12. Задан неупорядоченный список дней рождений в формате `ДД.ММ.ГГГГ`. Вывести упорядоченный список месяцев с количеством дней рождений в этом месяце. ``` List Dates = new List { new DateTime(1980, 4, 15), new DateTime(2022, 9, 22), new DateTime(2023, 1, 8), new DateTime(2000, 12, 31) }; DateTime date1 = GetNearestDate(Dates); Console.WriteLine($"Ближайшая дата рождения: {date1:dd.MM.yyyy}"); static DateTime GetNearestDate(List dates) { DateTime today = DateTime.Today; dates.Sort((d1, d2) => Math.Abs((d1 - today).Days).CompareTo(Math.Abs((d2 - today).Days))); return dates[0]; } ``` ### 13. Поиск наиболее популярного месяца: объявите массив произвольных дат в формате `ДД.ММ.ГГГГ`. Найдите самый популярный месяц. ``` string[] Dates = { "15.04.1980", "16.08.2006", "22.12.2023", "19.02.1861", "01.01.2000" }; Dictionary month1 = new Dictionary(); foreach (var date in Dates) { DateTime date1 = DateTime.ParseExact(date, "dd.MM.yyyy", null); string month = date1.ToString("MMMM"); if (month1.ContainsKey(month)) { month1[month]++; } else { month1.Add(month, 1); } } var popul = month1.Aggregate((l, r) => l.Value > r.Value ? l : r).Key; Console.WriteLine("Самый популярный месяц: " + popul); ``` ### 14. Пятница, 13-е. Докажите, что 13-е число месяца чаще всего приходится на пятницу. Напишите программу, которая выводит на экран 7 чисел: вероятности выпадения 13 числа каждого месяца на понедельник, вторник, среду, четверг, пятницу, субботу, воскресенье. ``` int years1 = 10; int count1 = 0; int count2 = 0; for (int year = 1; year <= years1; year++) { for (int month = 1; month <= 12; month++) { DateTime date1 = new DateTime(year, month, 13); if (date1.DayOfWeek == DayOfWeek.Friday) { count1++; } count2++; } } Console.WriteLine("Вероятности выпадения 13 числа каждого месяца на:"); Console.WriteLine("Понедельник: " + (double)CountOfThirteenths(DayOfWeek.Monday) / count2); Console.WriteLine("Вторник: " + (double)CountOfThirteenths(DayOfWeek.Tuesday) / count2); Console.WriteLine("Среда: " + (double)CountOfThirteenths(DayOfWeek.Wednesday) / count2); Console.WriteLine("Четверг: " + (double)CountOfThirteenths(DayOfWeek.Thursday) / count2); Console.WriteLine("Пятницу: " + (double)count1 / count2); Console.WriteLine("Субботу: " + (double)CountOfThirteenths(DayOfWeek.Saturday) / count2); Console.WriteLine("Воскресенье: " + (double)CountOfThirteenths(DayOfWeek.Sunday) / count2); static int CountOfThirteenths(DayOfWeek day) { int count3 = 0; for (int year = 1; year <= 10; year++) { for (int month = 1; month <= 12; month++) { DateTime date1 = new DateTime(year, month, 13); if (date1.DayOfWeek == day) { count3++; } } } return count3; } ``` ### 15. На одном из московских вокзалов билеты продают N касс. Каждая касса работает без перерыва определенный промежуток времени по фиксированному расписанию. Требуется определить, в какой промежуток времени работает наибольшее количество касс. (на входе в программу строка вида `00:00-01:00,00:30-02:30,...`) ``` string wod = "00:00-01:00,00:30-02:30,01:30-03:00,02:00-04:00,02:30-05:00"; string[] schel = wod.Split(','); int[] time1 = new int[24]; foreach (string schedule in schel) { string[] times = schedule.Split('-'); string[] startTime = times[0].Split(':'); string[] endTime = times[1].Split(':'); int hour1 = int.Parse(startTime[0]); int hour2 = int.Parse(endTime[0]); for (int i = hour1; i < hour2; i++) { time1[i]++; } } int maxTime = 0; for (int i = 0; i < 24; i++) { if (time1[i] > maxTime) { maxTime = time1[i]; } } Console.WriteLine("Максимальное количество касс работает в интервале: "); for (int i = 0; i < 24; i++) { if (time1[i] == maxTime) { Console.WriteLine("{0:00}:00 - {1:00}:00", i, i + 1); } } ``` ### 16. Для заданного года посчитайте количество выходных дней в этом году (то есть количество суббот и воскресений). ``` int years = 2006; int weeks = CalculateWeekends(years); Console.WriteLine($"Количество выходных дней в {years} году: {weeks}"); static int CalculateWeekends(int year) { DateTime date1 = new DateTime(year, 1, 1); DateTime date2 = new DateTime(year, 12, 31); int c = 0; for (var date = date1; date <= date2; date = date.AddDays(1)) { if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) { c++; } } return c; } ```