这题最有意思的是:如果生日不存在就输出-1。
生日不存在:
1、输入数据的不符合要求。比如时间小于0、月份大于12、天数大于31、月份和该月天数不相称等。
2、出生是的时间是闰年的2/29,可是18年后的那一年不是闰年。
AC代码:
#include<iostream> using namespace std; bool judgeLoopYear(int year) //判断是否是闰年 { if((year%4==0 && year%100!=0) || year%400==0) return true; return false; } bool judgeMonthDay(int year,int month,int day) //辅助判断输入的数据是否正确 { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day<=31 && day>0) return true; case 2: if((judgeLoopYear(year) && day<=29 && day>0) || (!(judgeLoopYear(year) && day<=28 && day>0))) return true; case 4: case 6: case 9: case 11: if(day<=30 && day>0) return true; } return false; } bool judgeInputCorrect(int year,int month,int day) //判断输入的数据格式是否正确 { if(year<0 || month>12 || month<=0 || day>31 || day<=0 || !judgeMonthDay(year,month,day)) return false; return true; } int knowDay(int year,int month) //根据某一年得到该年某一月份的天数 { switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: if((judgeLoopYear(year))) return 29; else return 28; case 4: case 6: case 9: case 11: return 30; } } int count(int year,int month,int day) //计算 { int i,num=0; num+=knowDay(year,month)-day; for(i=month+1;i<=12;i++) { num+=knowDay(year,i); } for(i=1;i<=17;i++) { if(judgeLoopYear(year+i)) num+=366; else num+=365; } for(i=1;i<month;i++) { num+=knowDay(year+18,i); } num+=day; return num; } bool no18Birthday(int year,int month,int day) //出生是闰年,18年后不是闰年,无生日 { if(month==2 && day==29 && judgeLoopYear(year+18)==false) return false; return true; } int main() { int year,month,day,cas; cin>>cas; while(cas--) { scanf("%d-%d-%d",&year,&month,&day); if(judgeInputCorrect(year,month,day)==false || no18Birthday(year,month,day)==false) { cout<<-1<<endl; continue; } cout<<count(year,month,day)<<endl; } return 0; }