Условие задачи
Вот и наступил долгожданный Юбилей Винни-Пуха. В волшебный лес на праздник собралось множество гостей. В том числе Винни-Пух пригласил к себе друзей из других галактик. К сожалению, когда он посылал приглашения, он совсем забыл, что на планете, где живут его друзья инопланетяне, все читают не слева направо, а справа налево. Винни-Пух понимает, что к Юбилею они уже не прилетят, но медвежонок не унывает. Он хочет проверить, правда ли, что дата его Юбилея, прочитанная справа налево, тоже существует, и инопланетяне прилетят в другой день. Помогите Винни-Пуху определить, ждать ли ему в гости инопланетных друзей.
Входные данные
Входной файл содержит дату Юбилея Винни-Пуха в формате dd.mm.gggg. Гарантируется, что дата корректна.
Выходные данные
В выходной файл нужно вывести YES, если дата, читающаяся справа налево корректна, и NO в противном случае.
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <iostream> #include <string> using namespace std; string reverse(string s){ string y; for (int i = 0; !s.empty(); i++){ if (s.back() != '.'){ y.push_back(s.back()); s.pop_back(); } if (s.back() == '.') s.pop_back(); } return y; } bool is_leap(int year){ bool leap; if ((year % 400) == 0) leap = true; else if ((year % 100) == 0) leap = false; else if ((year % 4) == 0) leap = true; else leap = false; return leap; } int get_days (int month, int year){ int days; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: is_leap(year)?days = 29:days=28; break; default: days = -1; } return days; } int main() { string s,y; getline(cin, s); y = reverse(s); int day = stoi(y.substr(0,2)); int month = stoi(y.substr(2,2)); int year = stoi(y.substr(4,4)); cout << (((month>=1)&&(month<=12)&&(day >= 1)&&(day <= (get_days(month, year))))?"YES":"NO"); return 0; } |
Тесты
Входные данные | Выходные данные |
23.02.2002 | YES |
20.02.2023 | NO |
20.12.2015 | NO |
20.12.2051 | YES |
Решение
Как только получили строку из стандартного ввода, воспользуемся функцией reverse(). Эта функция записывает нашу строку «задом наперед», в это же время удаляя символ ‘.’ из строки. Так как я точно знаю, что строка из ввода записана верно, то я могу не проверять остальные символы. Пользуясь этим же фактом я завел три переменные целочисленного типа: day, month, year. В новой строке присутствуют только цифры, поэтому я присваиваю каждой новой переменной соответствующие подстроки, после приведения типа string к типу int с помощью функции stoi(). В выводе проверяется соответствуют ли значения дня и месяца требованиям. День проверяется с помощью функции get_days(). Она позволяет получить количество дней в зависимости от месяца и года. В самой функции get_days() используется функция is_leap(), которая проверяет год на високосность и возвращается булевское значение. В зависимости от этого значения, изменяется значение количества дней в феврале — 28 или 29 соответственно. Когда наши числа прошли все проверки, то мы получаем на вывод «YES», если новая дата является корректной или «NO» в ином случае.
Засчитанная задача на e-olymp.com
Хорошо. Зачтено.