输出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 % == ) return ;
else if (year % != && year % == ) return ;
else return ;
} int days (int leap, int month) { // 判断这一年的1月到month月开始一共有多少天。这个函数好机智有木有。
switch (month) {
case : return ;
case : return ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
case : return leap ? : ;
}
} int monthDays(int leap, int temp) { // 判断当年的temp月有多少天。
switch (temp) {
case :
case :
case :
case :
case :
case :
return ;
case :
case :
case :
case :
case :
return ;
case :
return leap ? : ;
}
} int main() {
int month, week, day, y1, y2;
while(cin >> month >> week >> day >> y1 >> y2) {
int leapCount = ;
for (int i=; i<y1; ++i) {
if (run(i) == ) leapCount++;
}
for (int i=y1; i<=y2; ++i) {
// 对于我这种小学数学没学好的人来说。。。下面的计算太难了。。
int totDay = (i-)* + leapCount + days(run(i), month); // 从1850年开始到当年的这个月开始一共有多少天。
int weekDay= totDay% + ; //当年的这个月开始时周几。
int weekCount = day < weekDay ? : ; //需要跨过几个周。如果day>weekDay。说明计数周又可以减少一个。基数是1。因为是第几周的周几。所以跨过week-1就好了。
int ans = -weekDay + (week - weekCount)* + day;
if (ans <= monthDays(run(i), month)) // 如果这一天在这个月存在的话。输出。
{
cout << i << '/';
if (month < ) cout << "";
cout << month << '/';
if (ans < ) cout << "";
cout << ans << endl;
}
else cout << "none\n";
if (run(i) == ) leapCount++; // 开始这里忘记了。!!!
}
}
return ;
}