解题思路:
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语言代码)浏览:949 |
【偶数求和】 (C语言代码)浏览:432 |
1048题解(读入回车问题)浏览:566 |
Tom数 (C语言代码)浏览:561 |
Pascal三角 (C语言代码)浏览:664 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:611 |
C语言训练-最大数问题 (C语言代码)浏览:611 |
半数集问题 (C语言代码)浏览:925 |
C语言程序设计教程(第三版)课后习题7.4 (C++代码)浏览:559 |
Manchester-字符逆序(稳,附带小问题)浏览:5033 |