xiaoguizi


私信TA

用户名:xiaoguizi87

访问量:1679

签 名:

等  级
排  名 28892
经  验 528
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
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 人评分

  评论区

  • «
  • »