解题思路:
1、已经知道2011年11月11日是周五,那么可以先计算出任何一年11月11日是周几。
2、分两种情况讨论:
a 年份在2011年之后的,每增加一年,保存星期几的变量需要加1,如果是闰年需要再增加1。
b 年份在2011年之前的,每减少一年,保存星期几的变量需要减1,如果是闰年需要再增减1。
当知道目标年11月11日是周几后,想要求x月x日的结果,可以先求出两个日期在当年属于第几天,
求出两者相差的天数后,星期几之差等于前面结果mod7。因为差值可能出现负数,加上420保证数字为正,再mod7结果不变的。
最后需要判断,如果结果是0,代表是周日,题目要求用7表示。
参考代码:
#include<stdio.h>
int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int isLeap(int y)
{
if (y % 400 == 0) {
return 1;
} else if (y % 4 == 0 && y % 100 != 0) {
return 1;
}
return 0;
}
int daysInTheYear(int year, int month, int day)
{
int sum = day;
for (int i = 0; i < month - 1; i++) {
sum += days[i];
}
if (month > 2 && isLeap(year)) {
sum++;
}
return sum;
}
int main()
{
int y, m, d;
int i;
int res = 0;
scanf("%d %d %d", &y, &m, &d);
res = 5;
if (y > 2011) {
for (i = 2012; i <= y; i++) {
res = (res + 1 + isLeap(i)) % 7;
}
} else if (y < 2011) {
for (i = y + 1; i <= 2011; i++) {
res = (res - 1 - isLeap(i) + 7) % 7;
}
}
res = res + daysInTheYear(y, m, d) - daysInTheYear(y, 11, 11);
res = (res + 420) % 7;
if (res == 0) {
res = 7;
}
printf("%d\n", res);
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复