您的位置:首页 > 其它

CCF 2015-03-3 节日

2015-09-06 13:37 369 查看
输出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;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: