解题思路:
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 人评分
printf基础练习2 (有点不明白)浏览:887 |
WU-蓝桥杯算法提高VIP-企业奖金发放 (C++代码)浏览:1267 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:648 |
1128题解(返回值为数组的情况)浏览:571 |
sizeof的大作用 (C语言代码)浏览:1138 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:724 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |
淘淘的名单 (C语言代码)浏览:1309 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:504 |
WU-C语言程序设计教程(第三版)课后习题12.3 (C++代码)浏览:925 |