问题描述
有一类节日的日期并不是固定的,而是以“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。
这算是基本编程练习吧,一遍编译通过
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 ans = 8-weekDay+(week-1)*7; 91 if(ans<monthDays(leap,month)) 92 { 93 cout<<i<<"/"; 94 if(month<10) 95 cout<<0; 96 cout<<month<<"/"; 97 if(ans<10) 98 cout<<0; 99 cout<<ans<<endl; 100 } 101 else 102 cout<<"none"<<endl; 103 if(leap) 104 leapCount++; 105 } 106 return 0; 107 }
时间: 2024-11-05 06:24:58