输出y1到y2年之间的每一年的a月份的第b个周c。感觉像是一个恶心的模拟。更像一个很恶心的小学奥赛题。
题目:http://115.28.138.223/view.page?gpid=T25
考试的时候。我猜我是做不出来的。感觉这个代码的函数用的太机智了。某人智商堪忧丫。。。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<map> using namespace std; int run(int year) { // 判断是否是闰年。 if (year % 400 == 0) return 1; else if (year % 100 != 0 && year % 4 == 0) return 1; else return 0; } int days (int leap, int month) { // 判断这一年的1月到month月开始一共有多少天。这个函数好机智有木有。 switch (month) { case 1: return 0; case 2: return 31; case 3: return leap ? 60 : 59; case 4: return leap ? 91 : 90; case 5: return leap ? 121 : 120; case 6: return leap ? 152 : 151; case 7: return leap ? 182 : 181; case 8: return leap ? 213 : 212; case 9: return leap ? 244 : 243; case 10: return leap ? 274 : 273; case 11: return leap ? 305 : 304; case 12: return leap ? 335 : 334; } } int monthDays(int leap, int temp) { // 判断当年的temp月有多少天。 switch (temp) { case 1: case 3: case 5: case 7: case 8: case 12: return 31; case 4: case 6: case 9: case 10: case 11: return 30; case 2: return leap ? 29 : 28; } } int main() { int month, week, day, y1, y2; while(cin >> month >> week >> day >> y1 >> y2) { int leapCount = 0; for (int i=1850; i<y1; ++i) { if (run(i) == 1) leapCount++; } for (int i=y1; i<=y2; ++i) { // 对于我这种小学数学没学好的人来说。。。下面的计算太难了。。 int totDay = (i-1850)*365 + leapCount + days(run(i), month); // 从1850年开始到当年的这个月开始一共有多少天。 int weekDay= totDay%7 + 2; //当年的这个月开始时周几。 int weekCount = day < weekDay ? 1 : 2; //需要跨过几个周。如果day>weekDay。说明计数周又可以减少一个。基数是1。因为是第几周的周几。所以跨过week-1就好了。 int ans = 8-weekDay + (week - weekCount)*7 + day; if (ans <= monthDays(run(i), month)) // 如果这一天在这个月存在的话。输出。 { cout << i << ‘/‘; if (month < 10) cout << "0"; cout << month << ‘/‘; if (ans < 10) cout << "0"; cout << ans << endl; } else cout << "none\n"; if (run(i) == 1) leapCount++; // 开始这里忘记了。!!! } } return 0; }
时间: 2024-10-29 05:20:56