ZSTU-4242-校庆【浙江理工2016全国新生邀请赛E题】

4242: 校庆
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1754 Solved: 657
Description
2017年10月28日是zstu的120周年校庆,撒花,撒花。为此KI决定设计一个程序,来庆祝我们的校庆:
给出某一天的日期year-month-date, 求这一天到2017-10-28还差几天。
Input
第一行有个整数T, 表示测试组数。T≦100。
接下来每个测试组,给出三个数year month date。(1900 <=year <=2017 ), 保证每个日期均合法,并且小于2017-10-28。
Output
对于每个测试组,请输出对应的答案。

Sample Input
1
2017 10 1
Sample Output
27

分三种情况讨论,当时复制粘贴上半部分的函数,搞得下面一起弄错了,结束了才发现错误,算法没错,被自己坑了·····orz

#include<stdio.h>//667
int yeardays(int y)//计算每年多少天的函数
{
    if((y%4==0&&y%100!=0)||(y%400==0))
        return 366;
    else
        return 365;
}
int main()
{
    int t,y,m,d,i;
    int a[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
    int b[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年
    scanf("%d",&t);//t组数据
    while(t--)
    {
        int sum=0;
        scanf("%d%d%d",&y,&m,&d);//年月日

        if(y==2017)//第一种情况,当年份为2017年时
        {
            if(m==10)
            {
                printf("%d
",28-d);
            }
            else
            {
                for(i=m+1; i<10; i++)//当月除外,从下个月加到9月,这是完整的月份
                {
                    sum=sum+a[i];
                }
                sum=sum+a[m]-d+28;//从m月开始,因此m月只剩下a[m]-d天,最后加上十月份天数
                printf("%d
",sum);
            }
        }

        else if(y==2016)//第二种情况,当年份为2016年时
        {
            for(i=1; i<m; i++)//因为是2016年,因此2017年完整的确定为301天
            {
                sum=sum+b[i];//只需要计算此时日期是16年的第几天
            }
            sum=sum+d;
            sum=366-sum+301;//然后计算今年剩余的天数,再加上17年的301天
            printf("%d
",sum);
        }

        else//第三种情况,当年份为2016年之前时
        {
            if((y%4==0&&y%100!=0)||(y%400==0))//判断平年闰年
            {
                for(i=1; i<m; i++)
                {
                    sum=sum+b[i];
                }
                sum=sum+d;
                sum=366-sum;//与之前一样,判断当年剩下的天数
                for(i=y+1; i<2016; i++)
                {
                    sum=sum+yeardays(i);//从当年之后的年份往后加
                }
                printf("%d
",sum+667);
            }
            else
            {
                for(i=1; i<m; i++)
                {
                    sum=sum+a[i];
                }
                sum=sum+d;
                sum=365-sum;//与之前一样,判断当年剩下的天数
                for(i=y+1; i<2016; i++)
                {
                    sum=sum+yeardays(i);
                }
                printf("%d
",sum+667);
            }
        }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/kuronekonano/p/11794349.html