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");//注意换行,并且因为最后一个测试数据也换行了,所以我又把判断条件删了
//}
}
}
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");//注意换行,并且因为最后一个测试数据也换行了,所以我又把判断条件删了
//}
}
}
相关文章推荐
- 18岁生日所经过的总天数
- 杭电acm1052解题代码(详细注释)
- HDU1201求出生到18岁生日总天数
- Android App更新版本以及提示用户下载最新apk(有图,有代码,有最终效果图)详细解释及思路
- Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】
- PCA人脸识别,附matlab代码和详细注释
- HDU 1022 Train Problem I 附详细思路
- Prototype 1.4.0源码详细解释--脚本代码全文注释
- hdu 1013 过山车 匈牙利算法(代码+详细注释)
- POJ 1035 代码+详细注释
- 18岁生日(杭电1201)
- [造福社会][CEOI2012]5题(除计算几何题)题解(内含详细注释代码)
- 新浪微博自动转发评论 源码 按键精灵实现 详细注释 几十行代码实现 涉及图像识别模拟键盘鼠标
- 头条视频采集 带GUI界面 和代码详细注释
- 字典树模板(详细代码注释)
- 七种常见的排序算法--c++直接上代码,注释详细
- 代码注释要详细
- 杭电1000 C++ AC代码,A+Bproblem
- OpenCV中的DFT和iDFT的详细代码及注释
- 带有详细注释的 Redis 3.0 代码 (github.com)