蓝桥杯 易错题 特殊时间 c++

问题描述
2022 年 2 月 22 日 22:20 是一个很有意义的时间,
年份为 2022,由 3 个 2 和 1 个 0 组成,
如果将月和日写成 4 位,为 0222,也是由 3 个 2 和 1 个 0 组成,
如果将时间中的时和分写成 4 位,还是由 3 个 2 和 1 个 0 组成。

小蓝对这样的时间很感兴趣,他还找到了其它类似的例子,比如 111 年 10 月 11 日 01:11,2202 年 2 月 22 日 22:02 等等。

请问,总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日11:11不算,因为它里面没有两种数字。
解题思路 首先观察题目发现无需判断闰年,因为当日到29,无法构成合法的日期 如2229和9929,年也无需判断 我们开了一个含4个int数组,每个数字不超过9,无需担心年份的大小问题。我想便利每一种情况,判断时间的合理性,

时间复杂度较低,合理的时间记录下来,根据count=合法的年的个数*合法的月日的个数*合法的小时分钟个数得到结果

答案是212

 1 #include <iostream>
 2 int num[4],count;
 3 using namespace std;
 4 void check(int &y, int &m, int &h){
 5     int year = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3];
 6     int month = num[0] * 10 + num[1];
 7     int day = num[2] * 10 + num[3];
 8     int hour = month;
 9     int minute = day;
10     if(year > 0 && year<=9999)
11     y++;
12     if(month > 0 && month < 13 && day > 0 && day < 31)
13     m++;
14     if(hour > 0 && hour < 25 && minute >= 0 && minute < 60)
15     h++;
16 }
17 int main()
18 {
19      for (int i = 0; i < 10; i++)
20     {
21         for (int j = 0; j < 10; j++)    
22         {
23             if(i == j) continue;
24             int y = 0, m = 0, h = 0;    
25             for (int k = 0; k < 4; k++)
26             {
27                 num[k] = i;
28                 num[(k + 1) % 4] = num[(k + 2) % 4] = num[(k + 3) % 4] = j;
29                 check(y, m, h);
30             }
31             count += y * m * h;    
32         }
33     }
34     cout<<count<<endl;
35     return 0;
36 }

 

posted @ 2023-01-27 21:38  芜湖大厨师  阅读(181)  评论(0编辑  收藏  举报