您的位置:首页 > 编程语言

Problem G 【思路点拨和代码详细注释】-20180124下午实验室全体杭电比赛-算一下某人从出生到到达18岁生日时所经过的总天数

2018-01-25 12:32 316 查看
Problem Description
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。

 

[align=left]Input[/align]
一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
 

[align=left]Output[/align]
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
 

[align=left]Sample Input[/align]

1
1988-03-07

 

[align=left]Sample Output[/align]

6574

 
思路点拨:
1.如果某人在闰年出生,并且其生日正好是2月29。那么如果在18年后的那一年不是闰年的话,他就不会有十八岁生日。

2.假定出生年为y年,然后就把从“出生年”后一年的那一年(即y+1年)年初起到“18岁生日年”前一年的那一年(即y+17年)年末止,总共是17年的天数先算出来,再计算某人在18岁生日年(即y+18年)和出生年一共过了多少天。最后一累加,就是结果了。
(出生年指出生那一年,18岁生日年指18岁生日那一年)

代码示例+详细注释:

#include<stdio.h>

int main()

{

    int t,y,m,d,c,y1,m1,d1,s,i;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%d-%d-%d",&y,&m,&d);

        m1=m,d1=d;

        s=c=0;

        if(m==2&&d==29)

        {

            printf("-1");

        }

    /*

        如果某人在闰年出生,并且其生日正好是2月29。

        那么如果18年后的那一年不是闰年的话,他就不会有十八岁生日。

        我们知道:闰年要么是400的倍数(这时也肯定是4的倍数),要么是4的倍数但不是100的倍数,

        所以闰年肯定是4的倍数。

        因为18不是4的倍数,所以闰年年号+18之后也肯定不是4的倍数。

    */

        else

        {

            //假定出生年为y年,然后就把从“出生年”后一年的那一年(即y+1年)年初起

            //到“18岁生日年”前一年的那一年(即y+17年)年末止,总共是17年的天数

            //(出生的那一年没过完一整年,截止到18岁生日那一天的那一年也没过完呢)

            //出生年指出生那一年,18岁生日年指18岁生日那一年

            for(y1=y+1;y1<y+18;y1++)

            {

                if(y1%400==0||(y1%4==0&&y1%100!=0))

                {

                    c+=366;//c代表coun,计数的意思

                }

                else

                {

                    c+=365;

                }

            }

            //上面已经把17年的天数算完了,下面开始算在18岁生日年和出生年一共过了多少天。

            //先算在十八岁生日年一共过了多少天

            y1=y+18;

            if(y1%400==0||(y1%4==0&&y1%100!=0))//如果18岁生日年是闰年

            {

                    for(i=2;i<m;i++)

                    {

                        if(i==2)

                        {

                            c+=29;

                        }

                        else if(i==1||i==3||i==5||i==7||i==8||i==10)

                        {

                            c+=31;

                        }

                        else if(i==4||i==6||i==9||i==11)

                        {

                            c+=30;

                        }

                    }

            }

            else//如果18岁生日年不是闰年

            {

                    for(i=2;i<m;i++)

                    {

                        if(i==2)

                        {

                            c+=28;

                        }

                        else if(i==1||i==3||i==5||i==7||i==8||i==10)

                        {

                            c+=31;

                        }

                        else if(i==4||i==6||i==9||i==11)

                        {

                            c+=30;

                        }

                    }

            }

            c+=d;

            //再算在十八岁生日年一共过了多少天

            if(y%400==0||(y%4==0&&y%100!=0))//如果出生年是闰年

            {

                    for(i=2;i<m;i++)

                    {

                        if(i==2)

                        {

                            s+=29;

                        }

                        else if(i==1||i==3||i==5||i==7||i==8||i==10)

                        {

                            s+=31;

                        }

                        else if(i==4||i==6||i==9||i==11)

                        {

                            s+=30;

                        }

                    }

                    s+=d;

                    s=366-s;//这里使用的逆向计算法,就是计算一下某人在出生年的生日前,那一年一共过了多少天(s天)

                    //然后再用那一年的总天数(366或365)减去截止s

            }

            else//如果出生年不是闰年

            {

                    for(i=2;i<m;i++)

                    {

                        if(i==2)

                        {

                            s+=28;

                        }

                        else if(i==1||i==3||i==5||i==7||i==8||i==10)

                        {

                            s+=31;

                        }

                        else if(i==4||i==6||i==9||i==11)

                        {

                            s+=30;

                        }

                    }

                    s+=d;

                    s=365-s;

            }

            c+=s;

            printf("%d",c);//最后将结果打印出来就可以了

        }

        //if(t)

        //{

            printf("\n");//注意换行,并且因为最后一个测试数据也换行了,所以我又把判断条件删了

        //}

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: