问题描述
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
输入只有一行
YYYY MM DD
输出格式
输出只有一行
W
数据规模和约定
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
Idea: método de contraste.
首先规定一个已经确定过星期几的日期,这里以2017(平年)年1月1日星期7,为标准。
输入的年份分为两种情况:
第一种:
大于规定的年份,则要计算出,规定年份到输入的年份间的所有天数之和,再模上7(规定的是星期7)得到的即是结果
第二种:
小于或等于规定年份,计算该年份到规定年份前的所有天数,再计算在输入的年里,month和day共用多少天,用总天数 - 该年的里实际天数,用7模上这个结果
#include<stdio.h>
int isLeapYear(int n) {
//判断是否是润年
if (n%4==0 && n%100!=0 || n%400==0)
return 1;
return 0;
}
int md[13]= {
0,31,28,31,30,31,30,31,31,30,31,30,31};//全局变量定义,统一定义平年每月月份
int main() {
int year,month,day;
int i,sum=0,td=0;
while (scanf("%d%d%d",&year,&month,&day)!=EOF) {
sum=0;
td=0;
if (year>=2017) {
//输入的年份>=2017年时
for (i=2017; i<year; i++) {
sum+=365; //计算2017到year年前的所有天数
if (isLeapYear(i)) //是闰年天数加1
sum+=1;
}
for (i=1; i<month; i++) {
sum+=md[i]; //计算在输入的这年里,所有月份的天数之和
if (i==2&&isLeapYear(year)) //判断这年是不是闰年,是则2月份是的天数要加一
sum+=1;
}
sum+=day-1; //最终准确的天数
printf("%d\n",sum%7==0? 7:sum%7);
}else if (year<2017) {
//输入的年份小于2017
for (i=year; i<2017; i++) {
//计算输入的年份到规定的2017年前的总天数
sum+=365;
if (isLeapYear(i))//是闰年加1天
sum+=1;
}
for (i=1; i<month; i++) {
td+=md[i]; //td为输入年份该年里的所有天数
if (i==2&&isLeapYear(year)) {
//如果是二月,且该年是闰年的话。
td+=1; //增加1天
}
}
td+=day-1;
sum-=td;
printf("%d\n",7-sum%7);
}
}
return 0;
}
análisis:
sum+=day-1; //最终准确的天数
Aquí hay una corrección para todos los días superiores a 2017. 2017.1.1 es la séptima semana de la semana, y los múltiplos de cada 7 subsiguientes se toman como% 7 igual a 0 y 1% 7 = 1, por lo que -1 se puede corregir.
td+=day-1;
sum-=td;
De manera similar, si el año ingresado es menor que el año de referencia, primero realice td + = día-1; para corregirlo en relación con 2017.1.1. Por ejemplo, el hermano mayor, 2016.12.31 es la sexta semana de la semana, suma- = td; después de la corrección, suma = 1, por lo que el resultado de salida se corrige nuevamente por 7-suma% 7.