您的位置:首页 > 其它

HDU 1201 18岁生日问题

2011-03-25 23:47 393 查看
Description
Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
Input
一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。
Output
T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
Sample Input
1
1988-03-07
Sample Output
6574

分析:

主要就是判断闰年,生日是在2.29之前还是之后。

#include <iostream>
using namespace std;
bool IsLeap(int n)
{
return n%400==0||(n%4==0)&&(n%100!=0);
//return !( n % ( n % 100 ? 4 : 400 ) );
}
int main(void)
{
int T;
scanf("%d",&T);
while(T--)
{
int yy,mm,dd;
int count=0;
scanf("%d-%d-%d",&yy,&mm,&dd);
if(mm==2&&dd==29)
{
cout<<-1<<endl;
continue;
}
if(mm>=3)
{
for(int i=1;i<=18;i++)
if(IsLeap(yy+i))
count++;
cout<<365*18+count<<endl;
}
else
{
for(int i=0;i<18;i++)
if(IsLeap(yy+i))
count++;
cout<<365*18+count<<endl;
}
}
return 0;
}


关于闰年:

一年有12个月,而1、3、5、7、8、10、12月31天,4,6,9,11月30天,2月平年28天,闰年29天。

判定公历闰年遵循的一般规律为:四年一闰,百年不闰,四百年再闰.

首先要明白地球的公转时间确切的来说,是365.2422天,即是365日5小时48分46秒
其中的5小时48分先暂且给他加上11分14秒,成为6小时,说明了为什么要4年1润,因为4*6=24,每四年多出来了1个24小时。
从那6小时中减去的11分14秒我们暂且再给它加上3分10秒。成为14分24秒,即是14.4分
14.4分*100年为1440分钟,恰好为24小时。这说明了为什又要每100年不润。
从14分24秒加上的3分10秒也就是190秒,我们给190s加上26秒,成为216秒。216秒*400年便是86400秒便是24小时,说明了400年又要一润。
刚才从216秒钟减去的26秒乘以3200年为83200秒,23小时多一点,近似为一天了,说明每3200年又要少一润。
至于最后这个3200年的少一润为何不精确,相比看到这个年份也应该想明白了。历法自然也是在不断变化的,3200年内可能会发生很多变化。另外的地球的自转与公转也会受到各种影响在这3200年内发生一定的变化,从而导致现有的历法发生变动。因此3200年的这多的一润虽然现在看来不是完全精确的。不过已经绝对可以适用于现在的历法之中了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: