问题描述
有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。
现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。
提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。
为了方便你推算,已知1850年1月1日是星期二。
输入格式
输入包含恰好一行,有五个整数a, b, c, y1, y2。其中c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。
输出格式
对于y1和y2之间的每一个年份,包括y1和y2,按照年份从小到大的顺序输出一行。
如果该年的a月第b个星期c确实存在,则以"yyyy/mm/dd"的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠“/”分隔,位数不足时前补零。
如果该年的a月第b个星期c并不存在,则输出"none"(不包含双引号)。
样例输入
5 2 7 2014 2015
样例输出
2014/05/11
2015/05/10
评测用例规模与约定
所有评测用例都满足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1, y2 ≤ 2050。
这算是基本编程练习吧,一遍编译通过
评论里指出的错误已经改正,原来我没有管day=_=||
1 #include <iostream>
2 #include <vector>
3 #include <map>
4 #include <iomanip>
5
6 using namespace std;
7
8 bool isLeapYear(int year)
9 {
10 int temp = year%400;
11 if(temp==0)
12 {
13 return true;
14 }
15 else
16 {
17 temp = year%4;
18 int temp1 =year%100;
19 if(temp==0 && temp1!=0)
20 return true;
21 else
22 return false;
23 }
24
25 }
26 int days(bool leap,int month)
27 {
28 switch (month)
29 {
30 case 1:
31 return 0;
32 case 2:
33 return 31;
34 case 3:
35 return leap ? 60:59;
36 case 4:
37 return leap ? 91:90;
38 case 5:
39 return leap ? 121:120;
40 case 6:
41 return leap ? 152:151;
42 case 7:
43 return leap ? 182:181;
44 case 8:
45 return leap ? 213:212;
46 case 9:
47 return leap ? 244:243;
48 case 10:
49 return leap ? 274:273;
50 case 11:
51 return leap ? 305:304;
52 case 12:
53 return leap ? 335:334;
54 }
55 }
56 int monthDays(bool leap,int month)
57 {
58 switch (month)
59 {
60 case 1:
61 case 3:
62 case 5:
63 case 7:
64 case 8:
65 case 10:
66 case 12:
67 return 31;
68 case 4:
69 case 6:
70 case 9:
71 case 11:
72 return 30;
73 case 2:
74 return leap ? 29:28;
75 }
76 }
77 int main() {
78 int month,week,day,year1,year2,leapCount(0);
79 cin>>month>>week>>day>>year1>>year2;
80 for(int i = 1850;i<year1;i++)
81 {
82 if(isLeapYear(i))
83 leapCount++;
84 }
85 for(int i=year1;i<=year2;i++)
86 {
87 bool leap = isLeapYear(i);
88 int totalDays = (i-1850)*365+leapCount+days(leap,month);
89 int weekDay = totalDays%7+2;
90 int weekCount = day<weekDay ? 1:2;
91 int ans = 8-weekDay+(week-weekCount)*7+day;
92 if(ans<=monthDays(leap,month))
93 {
94 cout<<i<<"/";
95 if(month<10)
96 cout<<0;
97 cout<<month<<"/";
98 if(ans<10)
99 cout<<0;
100 cout<<ans<<endl;
101 }
102 else
103 cout<<"none"<<endl;
104 if(leap)
105 leapCount++;
106 }
107 return 0;
108 }
来源:https://www.cnblogs.com/Outer-Haven/p/4699131.html