这题比较水,就是一个判断闰年的问题,只是中间有一些细节要注意,我们说十八岁生日就是过了十八年,就像抓周就是满一岁,那就是过了一年。只是这个之中需要考虑一个平年还是闰年的问题,因为只有闰年才有2月29,别的没有,所有如果出生的时候就是闰年并且刚好是2月29的话,就不会有十八岁生日了,自然就是输出-1.再者就是需要讨论一下再者十八年之中的闰年个数。
首先看看是出生的时候是闰年的情况,难么在十八岁十八年之中需不需要将出生的这一年到下一年的这个时候算成是366天,这就得看出生的日期了。比如2月29之前出生的,到下一个月的这个时候,我们就有366天,因为在二月他度过了2月29这一天比平常多一天。
再者就是最后一个年是不是闰年(中间的不需要额外考虑,是闰年就是366天,不是就是365天),如果最后一年是闰年,就需要考虑出生的时间,如果是2月28(只有28)之后出生的就有这么一天多出来,因为 重倒数第二年到组后一年是不是度过了最后一年的29号需要看出生,现在出生在28之后,就是可以度过29号这一天,那么就有366天。
下面提供几组数据这个数据对了基本就可以AC
13 2004-1-22 2004-2-28 2004-2-29 2004-4-20 2003-2-20 2003-2-28 2003-3-20 2002-2-20 2002-2-28 2002-3-20 2001-2-20 2001-2-28 2001-3-20 结果: 6575 6575 -1 6574 6575 6575 6575 6574 6574 6575 6574 6574 6574最后在提供一个AC的的代码仅供参考。
include<iostream> using namespace std; int main() { int N; char a,b; int year,month, day,s,num,i; cin>>N; while(N--) { num=0; s=0; cin>>year>>a>>month>>b>>day; if((year%4==0&&year%100!=0)||year%400==0) { if(month==2&&day==29) s=-1; else if(month==1) s=366; else if(month==2&&day<=28) s=366; else s=365; } else s=365; for(i=1;i<=17;i++) { year+=1; if((year%4==0&&year%100!=0)||year%400==0) num+=366; else num+=365; } year+=1; if((year%4==0&&year%100!=0)||year%400==0) { if(month>=3) num+=1; else num+=0; } if(s==-1) s=-1; else s+=num; cout<<s<<endl; } return 0; }